排序演算法整理
阿新 • • 發佈:2020-07-18
https://www.cnblogs.com/onepixel/articles/7674659.html這個裡面比較詳細。
主要記快排和歸併。
快排:
快速排序的基本思想:通過一趟排序將待排記錄分隔成獨立的兩部分,其中一部分記錄的關鍵字均比另一部分的關鍵字小,則可分別對這兩部分記錄繼續進行排序,以達到整個序列有序。
6.1 演算法描述
快速排序使用分治法來把一個串(list)分為兩個子串(sub-lists)。具體演算法描述如下:
- 從數列中挑出一個元素,稱為 “基準”(pivot);
- 重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面(相同的數可以到任一邊)。在這個分割槽退出之後,該基準就處於數列的中間位置。這個稱為分割槽(partition)操作;
- 遞迴地(recursive)把小於基準值元素的子數列和大於基準值元素的子數列排序。
function quickSort(arr, left, right) { var len = arr.length, partitionIndex, left = typeof left != 'number'? 0 : left, right = typeof right != 'number'? len - 1 : right; if(left < right) { partitionIndex = partition(arr, left, right); quickSort(arr, left, partitionIndex-1); quickSort(arr, partitionIndex+1, right); } return arr; } function partition(arr, left ,right) { // 分割槽操作 var pivot = left, // 設定基準值(pivot) index = pivot + 1; for(vari = index; i <= right; i++) { if(arr[i] < arr[pivot]) { swap(arr, i, index); index++; } } swap(arr, pivot, index - 1); return index-1; } function swap(arr, i, j) { vartemp = arr[i]; arr[i] = arr[j]; arr[j] = temp;
}
歸併排序:
歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法(Divide and Conquer)的一個非常典型的應用。將已有序的子序列合併,得到完全有序的序列;即先使每個子序列有序,再使子序列段間有序。若將兩個有序表合併成一個有序表,稱為2-路歸併。
5.1 演算法描述
- 把長度為n的輸入序列分成兩個長度為n/2的子序列;
- 對這兩個子序列分別採用歸併排序;
- 將兩個排序好的子序列合併成一個最終的排序序列
function mergeSort(arr) { var len = arr.length; if(len < 2) { returnarr; } var middle = Math.floor(len / 2), left = arr.slice(0, middle), right = arr.slice(middle); return merge(mergeSort(left), mergeSort(right)); } function merge(left, right) { var result = []; while(left.length>0 && right.length>0) { if(left[0] <= right[0]) { result.push(left.shift()); } else{ result.push(right.shift()); } } while(left.length) result.push(left.shift()); while(right.length) result.push(right.shift()); return result; }