快速排序的時間複雜度與空間複雜度

我們來分析一下快速排序法的性能。

快速排序的時間性能取決於快速排序遞歸的深度,

可以用遞歸樹來描述遞歸算法的執行情況。

如圖9‐9‐7所示,它是{50,10,90,30, 70,40,80,60,20}在快速排序過程中的遞歸過程。由於我們的第一個關鍵字是50,正好是待排序的序列的中間值,因此遞歸樹是平衡的,此時性能也比較好。

在這裏插入圖片描述
在最優情況

Partition每次都劃分得很均勻,如果排序n個關鍵字,其遞歸樹的深度就爲
log2(2n+1),n \log_2(2n+1),節點個數爲n
例如2個節點,深度爲2.

第一次Partiation應該是需要對整個數組掃描一遍,做n次比較。

獲得的樞軸將數組一分爲二,那麼各自還需要T(n/2)的時間(注意是最好情況,所以平分兩半)
2Tn2Tn/2+nT1=0,n=(log22)×n 分成2塊:T(n)≤2T(n/2) +n,T(1)=0,其中n=(\log_22)\times n
不斷地劃分下去,我們就有了下面的不等式推斷
4Tn22Tn/4+n/2+n=4Tn/4+2n,2n=(log24)×n 分成4塊:T(n)≤2(2T(n/4)+n/2) +n=4T(n/4)+2n,其中2n=(\log_24)\times n

8Tn42Tn/8+n/4+2n=8Tn/8+3n 分成8塊:T(n)≤4(2T(n/8)+n/4) +2n=8T(n/8)+3n ……

nTnnT1+log2n×n=O(nlog2n) 分成n塊:T(n)≤nT(1)+(\log_2n)×n= O(n\log_2n)

也就是說,在最優的情況下,快速排序算法的時間複雜度爲O(nlogn)。

最壞的情況

待排序的序列爲正序或者逆序,每次劃分只得到一個比上一次劃分少一個記錄的子序列,注意另一個爲空。如果遞歸樹畫出來,它就是一棵斜樹

此時需要執行n‐1次遞歸調用,且第i次劃分需要經過n‐i次關鍵字的比較才能找到第i個記錄,也就是樞軸的位置,因此比較次數爲

img

最終其時間複雜度爲O(n^2)。

平均的情況

設樞軸的關鍵字應該在第k的位置(1≤k≤n),那麼:
T(n)=1nk=1n(T(k1)+T(nk))+n=2nk=1nT(k)+n T(n)=\frac{1}{n}\sum_{k=1}^{n}({T(k-1)+T(n-k))+n}=\frac{2}{n}\sum_{k=1}^{n}{T(k)+n}
空間複雜度

主要是遞歸造成的棧空間的使用,最好情況,遞歸樹的深度爲
log2n log_2n
其空間複雜度也就爲 O(logn),

最壞情況

需要進行n‐1遞歸調用,其空間複雜度爲O(n),

平均情況,

空間複雜度也爲O(logn)。

可惜的是,由於關鍵字的比較和交換是跳躍進行的,因此,

快速排序是一種不穩定的排序方法。

參考自:快速排序最好,最壞,平均複雜度分析

補充:
文本與公式書寫使用typora,但是typora不支持公式左對齊,所以寫出來比較難看。
另外,csdn的markdown 界面不夠好看。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章