快速排序複雜度證明 及優化

快排是分治的思想,分解成小問題解決(排序),合併(排序過程都是在一個數組上直接操作,不用合併的過程)。

快速排序複雜度

最壞情況(O(n^2))

證明:最壞情況下就是對已經排好序的序列操作,假設是從小到大,那麼last就會從最後一直比到first(哨兵位置)(共比較n-1次),並且將序列分爲1和n-1,之後n-1以類似方式被遞歸劃分。

假設算法每次都進行了這種不對稱劃分,劃分的時間代價爲θ(n)[//n是元素個數],因爲對一個大小爲0的數組遞歸調用後T(0)=θ(1)[//相當於只調用一次就會返回,不會進行更深層次的遞歸調用],算法的運行時間可以遞歸表示爲:

 T(n)=T(n-1)+T(0)+θ(n)=T(n-1)+θ(n)

書上說是用代換法。代換法兩步:1)假設解的形式  2)用數學歸納找出使解真正有效的常數。例如:

鏈接  (這個證明有錯誤)總的過程就是先根據經驗猜測,然後代入推導。

此處證明:鏈接


所以T(n)=θ(n^2). 快速排序在最壞情況下的運行時間是θ(n^2).最壞情況下並不比直接插入好。


最好情況(O(nlgn))

最好情況是在平均劃分的情況下:

T(n)≤2T(n/2)+θ(n).

之所以是≤,是因爲一個被劃分爲n/2取地板,另一個子問題大小爲n/2取天棚減1.

這個使用主定理(the Master Theorem方法證明:

主定理:



//主變量定理證明我沒看。

在T(n)≤2T(n/2)+θ(n)中,f(n)=θ(n)=cn.  a=2,b=2,所以使用第2條得T(n)=O(nlgn).

還討論了,劃分是9:1劃分,得到的結果是運行時間也是θ(nlgn).主要原因是任意一種常數比例進行的劃分都會產生深度爲θ(lgn)得遞歸樹。

平均情況θ(nlgn)

在平均情況下,好的劃分和壞的劃分是平均出現在劃分樹上的,當好、差劃分交替在各層時,快排的運行時間就如全是好的劃分一樣,爲θ(nlgn).


附知乎大佬回答:



//這個平均情況的公式不太理解

優化

//明天再來寫,根據規模使用不同的排序算法+快排變形。



參考:百度百科+《算法導論》

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