快速排序时间复杂度为O(n×log(n))的证明
快速排序時(shí)間復(fù)雜度為O(n×log(n))的證明
2014年05月22日 11:17:52?oohaha_123?閱讀數(shù):2789?標(biāo)簽:?快速排序算法導(dǎo)論復(fù)雜度證明?更多
個(gè)人分類:?資料收集整理數(shù)據(jù)結(jié)構(gòu)/算法
快速排序時(shí)間復(fù)雜度為O(n×log(n))的證明
?
?
之前只知道快速排序的平均時(shí)間復(fù)雜度為O(n×log(n)),最糟糕時(shí)復(fù)雜度為O(n^2),但卻不知道具體原因,今天好好證明一下,最后部分摘自《算法導(dǎo)論》。
首先再介紹一遍快排的思想:
通過一趟排序?qū)⒋庞涗浄指畛瑟?dú)立的兩部分,其中一部分記錄的關(guān)鍵字均比另一部分記錄的關(guān)鍵字小,則可分別對(duì)這兩部分記錄繼續(xù)進(jìn)行排序,以達(dá)到整個(gè)序列有序的目的。
?
?
1、最優(yōu)情況
在最優(yōu)情況下,Partition每次都劃分得很均勻,如果排序n個(gè)關(guān)鍵字,其遞歸樹的深度就為 [log2n]+1( [x] 表示不大于 x 的最大整數(shù)),即僅需遞歸 log2n 次,需要時(shí)間為T(n)的話,第一次Partiation應(yīng)該是需要對(duì)整個(gè)數(shù)組掃描一遍,做n次比較。然后,獲得的樞軸將數(shù)組一分為二,那么各自還需要T(n/2)的時(shí)間(注意是最好情況,所以平分兩半)。于是不斷地劃分下去,就有了下面的不等式推斷:
這說(shuō)明,在最優(yōu)的情況下,快速排序算法的時(shí)間復(fù)雜度為O(nlogn)。
?
?
2、最糟糕情況
然后再來(lái)看最糟糕情況下的快排,當(dāng)待排序的序列為正序或逆序排列時(shí),且每次劃分只得到一個(gè)比上一次劃分少一個(gè)記錄的子序列,注意另一個(gè)為空。如果遞歸樹畫出來(lái),它就是一棵斜樹。此時(shí)需要執(zhí)行n‐1次遞歸調(diào)用,且第i次劃分需要經(jīng)過n‐i次關(guān)鍵字的比較才能找到第i個(gè)記錄,也就是樞軸的位置,因此比較次數(shù)為?,最終其時(shí)間復(fù)雜度為O(n^2)。
?
?
3、一般情況
最后來(lái)看一下一般情況,平均的情況,設(shè)樞軸的關(guān)鍵字應(yīng)該在第k的位置(1≤k≤n),那么:
本來(lái)想按這種思路推導(dǎo)出來(lái),結(jié)果發(fā)現(xiàn)半天推不出結(jié)果,最后去翻閱《算法導(dǎo)論》7.4節(jié),發(fā)現(xiàn)證明過程還是蠻復(fù)雜的,我就偷懶貼一下好了~
總結(jié)
以上是生活随笔為你收集整理的快速排序时间复杂度为O(n×log(n))的证明的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: new和delete底层解析
- 下一篇: 运算符和有什么区别