快速排序最好,最壞,平均複雜度分析

轉自http://book.51cto.com/art/201108/287089.htm 很好的一篇詳細數學分析快排複雜度的文章~

我們來分析一下快速排序法的性能。快速排序的時間性能取決於快速排序遞歸的深度,可以用遞歸樹來描述遞歸算法的執行情況。如圖9‐9‐7所示,它是{50,10,90,30, 70,40,80,60,20}在快速排序過程中的遞歸過程。由於我們的第一個關鍵字是50,正好是待排序的序列的中間值,因此遞歸樹是平衡的,此時性能也比較好。

 
圖9-9-7
在最優情況下,Partition每次都劃分得很均勻,如果排序n個關鍵字,其遞歸樹的深度就爲.log2n.+1(.x.表示不大於x的最大整數),即僅需遞歸log2n次,需要時間爲T(n)的話,第一次Partiation應該是需要對整個數組掃描一遍,做n次比較。然後,獲得的樞軸將數組一分爲二,那麼各自還需要T(n/2)的時間(注意是最好情況,所以平分兩半)。於是不斷地劃分下去,我們就有了下面的不等式推斷。
  1. T(n)≤2T(n/2) +n,T(1)=0  
  2. T(n)≤2(2T(n/4)+n/2) +n=4T(n/4)+2n  
  3. T(n)≤4(2T(n/8)+n/4) +2n=8T(n/8)+3n  
  4. ……  
  5. T(n)≤nT(1)+(log2n)×nO(nlogn) 

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

在最壞的情況下,待排序的序列爲正序或者逆序,每次劃分只得到一個比上一次劃分少一個記錄的子序列,注意另一個爲空。如果遞歸樹畫出來,它就是一棵斜樹。此時需要執行n‐1次遞歸調用,且第i次劃分需要經過n‐i次關鍵字的比較才能找到第i個記錄,也就是樞軸的位置,因此比較次數爲 ,最終其時間複雜度爲O(n2)。

平均的情況,設樞軸的關鍵字應該在第k的位置(1≤k≤n),那麼:

 

由數學歸納法可證明,其數量級爲O(nlogn)。

就空間複雜度來說,主要是遞歸造成的棧空間的使用,最好情況,遞歸樹的深度爲log2n,其空間複雜度也就爲O(logn),最壞情況,需要進行n‐1遞歸調用,其空間複雜度爲O(n),平均情況,空間複雜度也爲O(logn)。

可惜的是,由於關鍵字的比較和交換是跳躍進行的,因此,快速排序是一種不穩定的排序方法。

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