眾所周知,快速排序的時間複雜度為\(o(n\textn)\)。雖然對此很容易直觀理解,但由於演算法的隨機特性,這一時間複雜度的嚴格證明並非顯然的。我將在這裡說明如何計算快速排序執行過程中的比較次數的期望,以此得到對時間複雜度的較為嚴謹的證明。
定義\(e(n)\)為對長度為\(n\)的陣列進行排序所需要的期望比較次數。考慮演算法的劃分過程,由於基準元素選擇的隨機性,每一種劃分結果的可能性是相等的。對每種情況下的比較次數取平均值,即可得到下面的遞推式:$$e(n)=\frac\sum_^ \left [e(k)+e(n-k)+n \right ]$$變數\(k\)列舉了不同的劃分情況,\(n\)表示劃分過程中的比較次數。\(e(0)=e(1)=0\),因為空陣列或只有乙個元素的陣列不需要比較。
得出遞推式後,剩下的就是數學推導了qwq
首先,我們注意到方括號裡的\(n\)可以從求和符號裡提取出來,而另外兩項是對稱的。於是等式可以改寫成下面的形式:
\[e(n)=n+\frac\sum_^ e(k)
\]等式中包含太多項。注意右側的字首求和形式,我們可以定義字首和\(s(n)=\sum_^ e(k)\)。等式再度簡化:
\[s(n)-s(n-1)=n+\fracs(n-1)
\]\[s(n)=n+\fracs(n-1)
\]等號兩邊同時除以\(n(n+1)\),得到
\[\frac=\frac+\frac
\]再做個換元,令
\[t(n)=\frac
\]局面頓時明了起來:
\[t(n)=t(n-1)+\frac
\]反覆運用這一遞推式得到
\[t(n)=\frac+\frac+\frac+\cdots+\frac+\frac
\]這就是我們很熟悉的東西啦。讓我們把調和級數的前\(n\)項和記作\(h_n\),\(t(n)\)就可以寫成這樣的形式:
\[t(n)=h_-\frac
\]接下來事情就順理成章了:
\[\begin
&s(n)=n(n+1)t(n)=n(n+1)\left(h_-\frac\right) \notag
\\&e(n)=s(n)-s(n-1)\notag
\\&\;\;\;\;\;\;\;\;\:=n[(n+1)h_-(n-1)h_n-3]\notag
\\&\;\;\;\;\;\;\;\;\:=n(\frac+h_+h_n-3)\notag
\\&\;\;\;\;\;\;\;\;\:=n\left[\frac+(h_+\frac)+h_n-3\right]\notag
\\&\;\;\;\;\;\;\;\;\:=2n(h_n-1)\notag
\\&\;\;\;\;\;\;\;\;\:=2n\left[\int_^\fracdx+o(1)\right]\notag
\\&\;\;\;\;\;\;\;\;\:=2n\left[\textn+o(1)\right]\notag
\\&\;\;\;\;\;\;\;\;\:=o(n\textn)\notag
\end\]
\(q.e.d.\;\;\;\;\;(\text)\)
快速排序的時間複雜度與空間複雜度
我理解的是,快速排序用的是分治法,運用的遞迴的演算法,先挑選乙個基準值,小於基準值的數放在左邊,大於基準值的數放在基準值的右邊,這樣就涇渭分明的三塊 但是這三塊是有序的,基準值左邊右邊的內 部數是無序的,所以,將基準值左右兩端繼續進行快速排序,直到區間長度為1,排序就完成了。下面使用vs2013實現...
排序演算法時間複雜度和空間複雜度比較
n 2表示n的平方,選擇排序有時叫做直接選擇排序或簡單選擇排序 排序方法平均時間最好時間最壞時間 桶排序 不穩定 o n o n o n 基數排序 穩定 o n o n o n 歸併排序 穩定 o nlogn o nlogn o nlogn 快速排序 不穩定 o nlogn o nlogn o n ...
各種排序演算法比較 時間複雜度,空間複雜度
n 2表示n的平方,選擇排序有時叫做直接選擇排序或簡單選擇排序 排序方法平均時間最好時間最壞時間 桶排序 不穩定 o n o n o n 基數排序 穩定 o n o n o n 歸併排序 穩定 o nlogn o nlogn o nlogn 快速排序 不穩定 o nlogn o nlogn o n ...