快速排序:最好,最壞以及平均複雜度推導理解

算法簡介:

快速排序使用分治法(Divide and conquer)策略來把一個序列(list)分爲較小和較大的2個子序列,然後遞歸地排序兩個子序列。

步驟爲:

  1. 挑選基準值:從數列中挑出一個元素,稱爲“基準”(pivot),
  2. 分割:重新排序數列,所有比基準值小的元素擺放在基準前面,所有比基準值大的元素擺在基準後面(與基準值相等的數可以到任何一邊)。在這個分割結束之後,對基準值的排序就已經完成,
  3. 遞歸排序子序列:遞歸地將小於基準值元素的子序列和大於基準值元素的子序列排序。

遞歸到最底部的判斷條件是數列的大小是零或一,此時該數列顯然已經有序。

選取基準值有數種具體方法,此選取方法對排序的時間性能有決定性影響。

 

時間複雜度:

最好情形:

    數學歸納法推導:

  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. T(n)< 8(2(T(n/16)+ n/8)+3n = 16T(n/16)+ 4n  
  5. ……  
  6. T(n)≤nT(1)+(log2n)×n= O(nlogn) 

    理解:

如下圖,最優情況下,每次找到的參考軸把數據分成均勻的兩半,最後應該是一個平衡二叉樹狀態;二叉樹的層數(logn)即爲遞歸需要進行的次數,並且每輪遞歸結束時,都將二叉樹遍歷了一遍(n),所以最優的情況下,時間複雜度爲O(nlogn)

                                                          

最壞情形:

       最壞情形下,爲正序或逆序排列,二叉樹畫出來應該是一棵斜樹,並且需要經過n-1次遞歸調用才能完成,且第i次劃分需要經過n‐i次關鍵字的比較才能找到第i個記錄,也就是樞軸的位置,所以:

                                                             

     最終的時間複雜度應該O(n2)

 

平均複雜度:

樞軸可以隨機的在第k的位置(1≤k≤n):

                   

 n-1是分割所使用的比較次數。因爲基準值是相當均勻地落在排列好的數列次序之任何地方,總和就是所有可能分割的平均。

這個意思是,平均上快速排序比理想的比較次數,也就是最好情況下,只大約比較糟39%。這意味着,它比最壞情況較接近最好情況。這個快速的平均運行時間,是快速排序比其他排序算法有實際的優勢之另一個原因。

 

 

空間複雜度

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

 

 

 

參考:

https://blog.csdn.net/weshjiness/article/details/8660583

https://zh.wikipedia.org/zh/%E5%BF%AB%E9%80%9F%E6%8E%92%E5%BA%8F

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