การเรียงลำดับข้อมูล (Sorting) คือ การนำชุดข้อมูลมาดำเนินการประมวลผลให้ได้ชุดข้อมูลใหม่ที่มีการจัดเรียงใหม่ ซึ่งผลการจัดเรียงอาจเรียงข้อมูลจากน้อยไปมาก (Ascending) หรือมากไปน้อย (Descending)
อาร์เรย์ (Array) หรือแถวลำดับ คือ การรวมกลุ่มของตัวแปรที่สามารถใช้ตัวแปร ชื่อเดียวกันแทนข้อมูลสมาชิกได้หลายตัวในคราวเดียว ด้วยการใช้เลขดรรชนี (Index) หรือซับสคริปต์ (Subscipt) เป็นตัวอ้างอิงตำแหน่งสมาชิกบนแถวลำดับนั้น [3]p.80
เรื่องยกกำลัง และ log [3]p.59 ถ้ามีข้อมูล 10 ตัว ก็จะได้ n = 10 กรณีที่ 1 : linear loops for(i = 0; i<n; i++) ... ได้ O(n) กรณีที่ 2 : nested loops for(i = 0; i<n; i++) ... for(j = 0; j<n; j++) ... ได้ O(n2) กรณีที่ 3 : logarithmic loops for(i = 0; i<n; i*=2) ... ได้ O(log n) กรณีที่ 4 : nested loops for(i = 0; i<n; i++) ... for(j = 0; j<n; j*=2) ... ได้ O(n log n)
ประสิทธิภาพของการเรียงลำดับข้อมูล หรือ BigO ของการจัดเรียงข้อมูลแต่ละแบบ [3]p.334 1. แบบ Selection Sort คือ O(n2) 2. แบบ Heap Sort คือ O(n log n) 3. แบบ Insertion Sort คือ O(n2) 4. แบบ Bubble Sort คือ O(n2) 5. แบบ Quick Sort คือ O(n log n) 6. แบบ Merge Sort คือ O(n log n)
รหัสต้นฉบับด้วยภาษาจาวา 10 แบบ - แบบ 1 Bubble Sort(2dim) - แบบ 2 Selection Sort - แบบ 3 Insertion Sort - แบบ 4 Binary Sort - แบบ 5 Bucket Sort - แบบ 6 Quick Sort - แบบ 7 Shell Sort - แบบ 8 Merge Sort - แบบ 9 Radix Sort # - แบบ 10 Heap Sort # - จัดเรียง 3 แบบ main + Dyn - แนวคิด sorting (Applet) ubc.ca #
Algorithm selectionSort (list,last) /* Pre list must contain at least one item last contains index to last element in the list Post list has been rearranged smallest to largest */ 1 set current to 0 2 loop (until last element sorted) 1 set smallest to current 2 set walker to current + 1 3 loop (walker <= last) 1 if (walker key < smallest key) 1 set smallest to walker 2 end if 3 increment walker 4 end loop // หน่วยที่เล็กที่สุด เปลี่ยนกับตำแหน่งปัจจุบัน 5 exchange (current, smallest) 6 increment current 3 end loop end selectionSort
/* Pre list must contain at least one item last contains index to last element in the list Post list has been rearranged in sequence low to high */ Algorithm bubbleSort (list, last) 1 set current to 0 2 set sorted to false // default not finish before loop 3 loop (current <= last AND sorted = false) // ทุกการทำซ้ำ เป็นการจัดเรียง 1 set walker to last 2 set sourted to true // default finish in loop 3 loop (walker > current) 1 if (walker data < walker - 1 data) // หากสลับตำแหน่ง แสดงว่าการจัดเรียงยังไม่จบ 1 set sorted to false // it is not finish 2 exchange (list, walker, walker - 1) 2 end if 3 decrement walker 4 end loop 5 increment current 4 end loop end bubblesort
procedure bubbleSort( A : list of sortable items ) n = length(A) repeat swapped = false for i = 1 to n-1 inclusive do /* if this pair is out of order */ if A[i-1] > A[i] then /* swap them and remember something changed */ swap( A[i-1], A[i] ) swapped = true end if end for until not swapped end procedure
<script> var a = [4, 1, 3, 5, 2, 6]; function bubbleSort(a) { var swapped; do { swapped = false; for (var i=0; i < a.length-1; i++) { if (a[i] > a[i+1]) { var temp = a[i]; a[i] = a[i+1]; a[i+1] = temp; swapped = true; } } } while (swapped); } console.log(a); bubbleSort(a); console.log(a); </script>
<script> var a = [4, 1, 3, 5, 2, 6]; function selectionSort(a) { var length = a.length; for (var i = 0; i < length - 1; i++) { var min = i; for (var j = i + 1; j < length; j++) { if (a[j] < a[min]) { min = j; } } if (min != i) { var tmp = a[i]; a[i] = a[min]; a[min] = tmp; } } } console.log(a); selectionSort(a); console.log(a); </script>
<script> var a = [4, 1, 3, 5, 2, 6]; console.log(a); quickSort(a, 0, a.length -1); console.log(a); function quickSort(arr, left, right) { var i = left; var j = right; var tmp; pivotidx = (left + right) / 2; var pivot = parseInt(arr[pivotidx.toFixed()]); /* partition */ while (i <= j) { while (parseInt(arr[i]) < pivot) i++; while (parseInt(arr[j]) > pivot) j--; if (i <= j) { tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; i++; j--; } } /* recursion */ if (left < j) quickSort(arr, left, j); if (i < right) quickSort(arr, i, right); return arr; } </script>
<script> var a = [4, 1, 3, 5, 2, 6]; console.log(a); heapSort(a); console.log(a); function swap(a, i, j) { var tmp = a[i]; a[i] = a[j]; a[j] = tmp; } function max_heapify(a, i, length) { while (true) { var left = i*2 + 1; var right = i*2 + 2; var largest = i; if (left < length && a[left] > a[largest]) { largest = left; } if (right < length && a[right] > a[largest]) { largest = right; } if (i == largest) { break; } swap(a, i, largest); i = largest; } } function heapify(a, length) { for (var i = Math.floor(length/2); i >= 0; i--) { max_heapify(a, i, length); } } function heapSort(a) { heapify(a, a.length); for (var i = a.length - 1; i > 0; i--) { swap(a, i, 0); max_heapify(a, 0, i-1); } } </script>