各種快速排序演算法

2021-06-07 04:07:12 字數 2397 閱讀 1834

在內部排序演算法中比較常用的排序演算法應該算快速排序了。時間複雜度為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,台灣譯為 泡沫排序或氣泡排序 是一種簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排...