演算法與資料結構(6) 快速排序(隨機化及優化)

2021-08-20 11:01:43 字數 1141 閱讀 6245

快速排序和歸併排序其實是差不多的,只不過就是歸併不管陣列內容是什麼,直接一分為二,

而快排是選擇乙個元素,將其放在合適的位置,使左邊的元素小於它,右邊的大於它~這樣逐漸遞迴~

它的核心就是partition過程:

之後逐漸遍歷右邊所有未被訪問元素

在遍歷的過程中逐漸整理讓整個陣列左部分小於 v 這個元素值,右部分大於 v。

在此過程中,用j 來記錄左右部分的分界點,當前訪問的元素記為 i 。這樣整個陣列中 arr[l+1……j ] < v,arr[j+1……i-1] >v

最後將l上的v和j交換,這樣就切分成功了~

**實現:

private static int partition(comparable arr, int l, int r)

}sorttesthelper.swap(arr, l, j);

return j;

}private static void sort(comparable arr, int l, int r)

public static void sort(comparable arr)

(1) 優化一

還是遞迴到底的問題,高階的排序演算法在底層時可以使用插入排序來優化快排,當元素較少時,可使用插入排序來提高效能~

(2) 優化二

提到過歸併和快排都是分成兩部分,歸併是平分為二,整個層數就是logn層,每一層都是消耗o(n)時間

但是快速劃分的是選取的那個標誌點、這樣就會分成一大一小,假如選的最小或最大的那個點,那麼情況更嚴重,即整個陣列幾乎有序~這樣劃分樹的高度就是n,每層消耗o(n),最終複雜度就是o(n^2)。

解決的辦法就是:隨機選取乙個標記點~,但是這還是會出現最壞情況仍是o(n^2),只是說概率很低。

總結:歸併和快速儘管都是o(nlogn)級別的,但是快排是有常數級別的優勢,即使已經對歸併優化過了。

隨機化快速排序

define max size 100 include include using namespace std 交換指標p1,p2指向的值 void exchange int p1,int p2 pa為指向a的陣列,p,r為下標,對a p.r 進行就地重排,以a r 為主元 劃分為小於主元和大於主元...

常見排序演算法 隨機化快速排序演算法

基本思想 在快速排序的思想上,對基數的選擇採用了乙個隨機化的選擇。1.對於遞迴到某一層的陣列中,在該陣列中隨機化選擇乙個數字,把陣列中的數字分為兩部分,比該數字小的資料都放在它的左邊,比該數字大的資料都放在它的右邊。2.適用遞迴的思路對每次選出來的數字的左右兩邊進行排序。include includ...

隨機化的快速排序

快排是所有排序演算法中平均效能最好的一種排序,雖然它的最壞的情況和氣泡排序一樣是 n 2。但是平均來說為o n logn 現在研究生又開始學演算法了,主要是隨機演算法,分布式演算法,和概率演算法。第一節課講的是隨機化的快速排序,但是我覺得當n比較小的時候不適合隨機演算法,因為隨機的過程也在花費時間,...