快速排序時間復雜度為O(n×log(n))的證明
之前只知道快速排序的平均時間復雜度為O(n×log(n)),最糟糕時復雜度為O(n^2),但卻不知道具體原因,今天好好證明一下,最后部分摘自《算法導論》。
首先再介紹一遍快排的思想:
通過一趟排序將待排記錄分割成獨立的兩部分,其中一部分記錄的關鍵字均比另一部分記錄的關鍵字小,則可分別對這兩部分記錄繼續進行排序,以達到整個序列有序的目的。
1、最優情況
在最優情況下,Partition每次都划分得很均勻,如果排序n個關鍵字,其遞歸樹的深度就為 [log2n]+1( [x] 表示不大於 x 的最大整數),即僅需遞歸 log2n 次,需要時間為T(n)的話,第一次Partiation應該是需要對整個數組掃描一遍,做n次比較。然后,獲得的樞軸將數組一分為二,那么各自還需要T(n/2)的時間(注意是最好情況,所以平分兩半)。於是不斷地划分下去,就有了下面的不等式推斷:
這說明,在最優的情況下,快速排序算法的時間復雜度為O(nlogn)。
2、最糟糕情況
然后再來看最糟糕情況下的快排,當待排序的序列為正序或逆序排列時,且每次划分只得到一個比上一次划分少一個記錄的子序列,注意另一個為空。如果遞歸樹畫出來,它就是一棵斜樹。此時需要執行n‐1次遞歸調用,且第i次划分需要經過n‐i次關鍵字的比較才能找到第i個記錄,也就是樞軸的位置,因此比較次數為 ,最終其時間復雜度為O(n^2)。
3、一般情況
最后來看一下一般情況,平均的情況,設樞軸的關鍵字應該在第k的位置(1≤k≤n),那么:
本來想按這種思路推導出來,結果發現半天推不出結果,最后去翻閱《算法導論》7.4節,發現證明過程還是蠻復雜的,我就偷懶貼一下好了~