我們來分析一下快速排序法的性能。
快速排序的時間性能取決於快速排序遞歸的深度,
可以用遞歸樹來描述遞歸算法的執行情況。
如圖9‐9‐7所示,它是{50,10,90,30, 70,40,80,60,20}在快速排序過程中的遞歸過程。由於我們的第一個關鍵字是50,正好是待排序的序列的中間值,因此遞歸樹是平衡的,此時性能也比較好。
在最優情況
Partition每次都劃分得很均勻,如果排序n個關鍵字,其遞歸樹的深度就爲
例如2個節點,深度爲2.
第一次Partiation應該是需要對整個數組掃描一遍,做n次比較。
獲得的樞軸將數組一分爲二,那麼各自還需要T(n/2)的時間(注意是最好情況,所以平分兩半)
不斷地劃分下去,我們就有了下面的不等式推斷
也就是說,在最優的情況下,快速排序算法的時間複雜度爲O(nlogn)。
最壞的情況,
待排序的序列爲正序或者逆序,每次劃分只得到一個比上一次劃分少一個記錄的子序列,注意另一個爲空。如果遞歸樹畫出來,它就是一棵斜樹。
此時需要執行n‐1次遞歸調用,且第i次劃分需要經過n‐i次關鍵字的比較才能找到第i個記錄,也就是樞軸的位置,因此比較次數爲
最終其時間複雜度爲O(n^2)。
平均的情況
設樞軸的關鍵字應該在第k的位置(1≤k≤n),那麼:
空間複雜度,
主要是遞歸造成的棧空間的使用,最好情況,遞歸樹的深度爲
其空間複雜度也就爲 O(logn),
最壞情況,
需要進行n‐1遞歸調用,其空間複雜度爲O(n),
平均情況,
空間複雜度也爲O(logn)。
可惜的是,由於關鍵字的比較和交換是跳躍進行的,因此,
快速排序是一種不穩定的排序方法。
補充:
文本與公式書寫使用typora,但是typora不支持公式左對齊,所以寫出來比較難看。
另外,csdn的markdown 界面不夠好看。