快排是分治的思想,分解成小問題,解決(排序),合併(排序過程都是在一個數組上直接操作,不用合併的過程)。
快速排序複雜度
最壞情況(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)用數學歸納找出使解真正有效的常數。例如:
鏈接 (這個證明有錯誤)總的過程就是先根據經驗猜測,然後代入推導。
此處證明:鏈接:
最好情況(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).
附知乎大佬回答:
//這個平均情況的公式不太理解
優化
//明天再來寫,根據規模使用不同的排序算法+快排變形。
參考:百度百科+《算法導論》