快速排序(Quicksort)學習筆記

2021-08-14 21:08:09 字數 2714 閱讀 5405

看完鄧俊輝的《資料結構(第三版)》中快速排序後的學習總結

一.快速排序(quicksort):基於分治策略的又一經典演算法。類似於歸併排序(mergesort)。

將序列分為前後兩個子串行,並對這兩個規模更小的子串行進行遞迴。

quicksort和mergesort都採用了分治策略。

但quicksort要求前一串行中的任何元素在數值上都不得超過後一串行中的任意元素。

二.軸點(pivot)

快速排序演算法的核心在於如何快速的確定軸點。就是將所有元素逐個轉換為軸點的

過程。三.構造軸點

一般選取首元素作為軸點的候選

,lo與hi為兩個指標

。這兩個指標將整個序列分為l,

u和g三個部分。l是乙個字首,其中的任乙個元素在數值上都不超過軸點候選。g是乙個字尾,其中的任乙個元素在數值上都不小於軸點候選。而居於二者之間的子串行u則由大小仍然未知的元素構成。在初始狀態下,u是整個序列,而l和g都是空的。

演算法啟動後,lo和hi會交替移動,批次靠近。lo每向後移動一步,l也會向後拓展乙個單位。hi每向前移動一步,g也會向前拓展乙個單位。為了完成這種擴充套件,需要將u中的某個元素適當地加入到l或g中。當lo與hi同時指向同乙個位置時,我們只需將之前選定的軸點候選放到這個位置。這個候選者也就成為了名副其實的軸點。

四.單調性+不變性

1)不變性:子串行l中的元素都不超過軸點候選,子串行g中的元素都不小於軸點候                     選。[lo]和[hi]交替空閒。

2)單調性:子串行長度的單調性。子串行l個子序列g的長度都會有所增加。同時相應的子串行u的長度縮短了。

初始條件下,u的首元素已經作為軸點的候選被取出備份,因此它可以被認為是空閒的。

一般情況下的u的首元素為lo,末元素為hi。不是一般性假設此時的lo是空閒的。因此可以嘗試著向左側拓展子串行g,具體來說只要當前u的末元素,也就是hi在數值上不小於候選軸點。通過令hi--遞減乙個單位,從而將元素hi歸入到子串行g中。接下來,若果新的末元素,依然滿足這樣的要求,我們就繼續將其歸入到g中。直到某個時刻末元素hi不在滿足這個要求。也就是說此時的元素hi在數值上會嚴格小於候選軸點。此時,將末元素hi轉移至當前仍然空閒的單元lo中。因此單元lo將不再是空閒的,相應的hi隨即變成空閒的。也就是說u所具有的不變性依然成立。接著去考察u的首元素lo,只要這個元素在數值上不超過候選軸點,則令lo++遞增乙個單位。從而將這個首元素歸入到子串行l中。子串行l也會因此向後端拓展乙個單元。只要首元素lo在數值上依然不超過候選軸點,我們都會同樣的將它歸入到子串行中。否則,將lo的元素轉移到當前仍然是空閒的那個單元hi中。

當u退化為只有乙個空閒單元時,此時只需將候選軸點植入於唯一的這個空閒單元,真正成為乙個名副其實的軸點。此時,一次快速劃分結束。

五.例項

六.效能分析

1)不穩定性unstable

原始序列:6 3 8 2 5a 9 4 5b 1 7

一次快速排序後:1 3 5b 2 5a 4 6 9 8 7

5a和5b的排列順序發生了顛倒,所以說快速排序是不穩定的。

2)就地in-place

整個演算法可以就地實現,也就是說它只需o(1)常數的附加空間。

原始的輸入序列+常數個指標+用於儲存候選軸點的乙個單元

3)最好情況

每次劃分都(接近)平均,軸點總是(接近)**。

t(n) = 2*t((n-1)/2) + o(n) = o(nlogn)

4)最壞情況

每一次候選節點都是在當前而言,最小或最大的極值元素。以至於劃分之後,子串行l或g為空,在我們所劃分出來的一對子任務中,總是有乙個規模為零,而另乙個相對於此前的規模,只減少了乙個單元。

因此我們可以採取某些策略,在一定程度上降低最壞情況出現的概率。

隨機選取法:不再是每次都選取首元素作為候選軸點,而是在整個序列中隨機的選擇其一。

三者取中法

每次在整個序列中隨機的抽取三個元素,將其中數值居中的那個作為候選軸點。

5)平均情況:o(nlogn)

(注:具體計算步驟涉及調和級數,高數還是得好好學。)

快速排序 QuickSort

快速排序通常用於排序的最佳的使用選擇,其期望執行時間為 o nlgn 能夠進行就地排序。最壞執行時間為 o n 2 演算法描述 分解 divide 陣列 a beg end 被劃分為兩個子陣列 a beg mid 1 和a mid 1 end 使得a beg mid 1 中的資料都小於 a mid ...

快速排序 quicksort

快速排序 quicksort 是分治法的典型例子,它的主要思想是將乙個待排序的陣列以陣列的某乙個元素x為軸,使這個軸的左側元素都比x大,而右側元素都比x小 從大到小排序 然後以這個x在變換後陣列的位置i分為左右兩個子陣列,再分別進行快速排序,直到子陣列中只有乙個元素為止。快速排序演算法如下 void...

快速排序 QuickSort

1,void quicksort int a,int low,int high 這個函式是排序的遞迴部分,mid就是已經確定的基準元素的位置。2,int partition int a,int low,int high 這個函式幹了兩件事 1 挑出來乙個基準元素 這裡選的是最後乙個作為基準 找它的正...