快速排序算法的時間復雜度分析[詳解Master method]
經常聽人談起各種排序算法的時間復雜度,這個是O(n2)的,那個是O(n)的,這些人講起來可謂滔滔不絕,但是你停下來問問他為什么這個是這個復雜度,他是怎么算出來的?往往沒幾個人能說出來。這個是一個浮躁的社會,大家都追求速度,到處復制,粘貼代碼,拿人家的代碼跑一便,就說自己會了這個,會了那個..
也許有人覺得算法分析的太深沒有用,但是筆者認為,有時候了解細節很重要,比如快速排序算法的時間復雜度,有時候是O(nlgn), 有時候就是O(n2), 在你不知道自己數據特性的情況下,很難選擇是否使用快速排序,因為他並不總是最快的。
說了些沒用的,讓我們進入正題吧:
為了分析快速排序的時間復雜度,請先看下面的主定理:
主定理: T [n] = aT[n/b] + f (n)
其中 a >= 1 and b > 1 是常量 並且 f (n) 是一個漸近正函數, 為了使用這個主定理,您需要考慮下列三種情況:

想必大家都知道快速排序的過程,如果對這個過程有什么不了解,請參考下文:
http://www.cnblogs.com/pugang/archive/2012/06/27/2565093.html
快速排序的每一次划分把一個 問題分解成兩個子問題,其中的關系可以用下式表示:
T[n] = 2T[n/2] + O(n) 其中O(n)為PARTITION()的時間復雜度,對比主定理,
T [n] = aT[n/b] + f (n)
我們的快速排序中:a = 2, b = 2, f(n) = O(n)

那么為什么還有最壞情況呢?
考慮如下極端情況,
T[n] = T[n-1] + T[1] + O(n),
問題來了,這一次的划分白玩了,划分之后一邊是一個,一邊是n-1個,這種極端情況的時間復雜度就是O(n2).
總結
理解了主定理好多算法分析就迎刃而解了,本文沒有給出注定理的證明,因為對於大家意義不大,感興趣的讀者可以參考相關的書籍。最后用一句話總結:天下大事必做於細,差之毫厘有時候真會謬之千里..
注:本文在發布的過程中由於文章里面有公式,不能發布,故改傳了兩張圖..
另外,本文敘述的master method(主定理)並非本人原創,而是源自互聯網,開始時本人並沒有感覺此處會引起誤解因為稱得上定理的東西都不是這種隨筆類的文章可以原創的,但是還是有人覺得沒說清楚,於是在此給予澄清。
