快速排序的時間複雜度與期望比較次數

2022-06-29 22:39:12 字數 1508 閱讀 9275

眾所周知,快速排序的時間複雜度為\(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 ...