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

2021-08-18 02:33:18 字數 1245 閱讀 7707

證明:最壞情況下就是對已經排好序的序列操作,假設是從小到大,那麼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)用數學歸納找出使解真正有效的常數。例如:

執行時間是θ(n^2).最壞情況下並不比直接插入好。

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

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

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

方法證明:

主定理:

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

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

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

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

附知乎大佬回答:

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

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

快速排序的時間複雜度與空間複雜度

我理解的是,快速排序用的是分治法,運用的遞迴的演算法,先挑選乙個基準值,小於基準值的數放在左邊,大於基準值的數放在基準值的右邊,這樣就涇渭分明的三塊 但是這三塊是有序的,基準值左邊右邊的內 部數是無序的,所以,將基準值左右兩端繼續進行快速排序,直到區間長度為1,排序就完成了。下面使用vs2013實現...

分塊的複雜度證明

我們都知道,分塊的時間複雜度是 o n sqrt n o n n 不過不知大家有沒有想過這個複雜度是如何得出的?如果你只關心分塊演算法的實現及其應用,請忽略這篇文章 如果你早就知道了證明方法,請忽略這篇文章 如果你是神犇,請務必忽略以下內容 設定在給出證明之前,先給出一些符號宣告 設原序列的長度為 ...

Manacher時間複雜度證明

今天,我們來證明一下manacher的時間複雜度。先貼上manacher演算法的模板 s 0 s m for b 1 ss b 0 b s m for int i 1 i m i 我們考慮產生複雜度的地方,分別是最外層對整個字串的遍歷和每次對回文串擴充套件的while。顯然,最外層的for迴圈是o ...