在內部排序演算法中比較常用的排序演算法應該算快速排序了。時間複雜度為n*lgn。然而快排演算法的實現又有很多的版本。下面總結一下。
一、常規快排演算法(以陣列中乙個元素作為旋轉點)
// quicksort the subarray from a[lo] to a[hi]
private static void sort(comparable a, int lo, int hi)
劃分方法如下
// partition the subarray a[lo .. hi] by returning an index j
// so that a[lo .. j-1] <= a[j] <= a[j+1 .. hi]
private static int partition(comparable a, int lo, int hi)
// put v = a[j] into position
exch(a, lo, j);
// with a[lo .. j-1] <= a[j] <= a[j+1 .. hi]
return j;
}
其中,劃分方法中的選擇點的選擇對演算法的效能影響比較大。基於這個原因,有些改進演算法,有的選擇陣列的中間項作為旋轉點,但這樣的改進等於沒改進,因為選第乙個和選中間那個效果是一樣的,覺得是一種自欺欺人的方法。有一種比較合理的改進是,先用shuffle演算法(洗牌演算法)對原始陣列進行處理,使得陣列中的各項值均勻地隨機排列,然後再用常規快排演算法。
// quicksort the array
public static void sort(comparable a)
// quicksort the subarray from a[lo] to a[hi]
private static void sort(comparable a, int lo, int hi)
還有一種改進旋轉點的方法是採用三者取中劃分。就是從陣列選出三個元素,使用這三個元素的中間值的那個元素作為劃分點。
二、三路劃分快速排序演算法。改演算法將陣列劃分為3部分,比劃分元素小的元素,與劃分元素相等的元素,比劃分元素大的元素。然後遞迴處理比劃分元素小的元素和比劃分元素大的元素。
// quicksort the subarray a[lo .. hi] using 3-way partitioning
private static void sort(comparable a, int lo, int hi)
// a[lo..lt-1] < v = a[lt..gt] < a[gt+1..hi].
sort(a, lo, lt-1);
sort(a, gt+1, hi);
assert issorted(a, lo, hi);
}
三、快排的綜合改進版。當遞迴呼叫快速排序演算法時,處理的陣列的規模會越來越小,當小的一定程度時,採用比較簡單的插入排序演算法會比快速排序更有優勢;同時採用前面講到的三者取中劃分方法和三路快排。
private static void sort(comparable a, int lo, int hi)
// use median-of-3 as partitioning element
else if (n <= 40)
// use tukey ninther as partitioning element
else
// bentley-mcilroy 3-way partitioning
int i = lo, j = hi+1;
int p = lo, q = hi+1;
while (true)
exch(a, lo, j);
i = j + 1;
j = j - 1;
for (int k = lo+1; k <= p; k++) exch(a, k, j--);
for (int k = hi ; k >= q; k--) exch(a, k, i++);
sort(a, lo, j);
sort(a, i, hi);
}// sort from a[lo] to a[hi] using insertion sort
private static void insertionsort(comparable a, int lo, int hi)
// return the index of the median element among a[i], a[j], and a[k]
private static int median3(comparable a, int i, int j, int k)
快速排序比較次數 各種排序演算法總結
各種排序演算法的穩定性,時間複雜度和空間複雜度總結 我們比較時間複雜度函式的情況 時間複雜度函式o n 的增長情況 所以對於n較大的排序記,一般的選擇都是時間複雜度為o nlog2n 的排序方法。時間複雜度來說 1.平方階o n2 排序 各類簡單排序 直接插入排序,直接選擇排序和氣泡排序 2.線性對...
排序 各種排序演算法
每次將乙個待排序的記錄,按其關鍵字大小插入到前面已經排好序的子表中適當位置,直到全部記錄插入完成為止 待排序的記錄放在陣列r 0,n 1 中 排序過程中將r分成兩個子區間,有序區r 0,i 1 無序區r i,n 1 將當前無序區的第1個記錄,插入到有序區中適當的位置上 每次是有序區增加乙個記錄,知道...
各種排序演算法
交換函式 void swap int a,int b 氣泡排序 氣泡排序 bubble sort,台灣譯為 泡沫排序或氣泡排序 是一種簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排...