算法簡介:
快速排序使用分治法(Divide and conquer)策略來把一個序列(list)分爲較小和較大的2個子序列,然後遞歸地排序兩個子序列。
步驟爲:
- 挑選基準值:從數列中挑出一個元素,稱爲“基準”(pivot),
- 分割:重新排序數列,所有比基準值小的元素擺放在基準前面,所有比基準值大的元素擺在基準後面(與基準值相等的數可以到任何一邊)。在這個分割結束之後,對基準值的排序就已經完成,
- 遞歸排序子序列:遞歸地將小於基準值元素的子序列和大於基準值元素的子序列排序。
遞歸到最底部的判斷條件是數列的大小是零或一,此時該數列顯然已經有序。
選取基準值有數種具體方法,此選取方法對排序的時間性能有決定性影響。
時間複雜度:
最好情形:
數學歸納法推導:
- T(n)≤ 2T(n/2) + n,T(1)= 0
- T(n)≤ 2(2T(n/4)+ n/2) +n = 4T(n/4)+ 2n
- T(n)≤ 4(2T(n/8)+ n/4) +2n = 8T(n/8)+ 3n
- T(n)< 8(2(T(n/16)+ n/8)+3n = 16T(n/16)+ 4n
- ……
- 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