第7章 快速排序
像合併排序一樣,快速排序也是基於分治模式的。下面對乙個典型的子陣列a[p…r]排序的分治過程的三個步驟:
分解:陣列a[p…r]被劃分成兩個(可能空)的子陣列a[p…q-1]和a[q+1…r],使得a[p…q-1]中的每個元素都小於等於a[q],a[q+1…r]中的每個元素都大於等於a[q],下標q也是在劃分過程不斷計算的。
解決:通過遞迴呼叫快速排序,對子陣列a[p…q-1]和a[q+1…r]排序。
合併:因為兩個子陣列是就地排序的,不需要將它們進行合併操作。
quicksort(a, p, r)
1. if p < r
2. then q <-- partition(a, p, r)
3. quicksort(a, p, q-1)
4. quicksort(a, q+1, r)
partition(a, p, r)
1 x <-- a[r]
2 i <-- p-1
3 for j<-- p to r-1
4 do if a[j] ≤ x
5 then i <-- i+1
6 exchange a[i] <--> a[j]
7 exchange a[i+1] <--> a[r]
8 return i+1
快速排序的效能
最壞情況劃分
快速情況的最壞劃分情況發生在劃分過程產生的兩個區域分別包含n-1個元素和1個0元素的時候,即有乙個子陣列是完全空的。假設演算法的每一次遞迴呼叫中都出現這種不對稱的劃分,劃分的時間代價為θ(n)。因為對乙個大小為0的陣列進行遞迴呼叫後,返回t(0) = θ(1),故演算法的執行時間可以遞迴表示為:t(n) = t(n-1) + t(0) + θ(n) = t(n-1) + θ(n)。那麼t(n-1) = t(n-2) + θ(n),t(n-2) = t(n-3) + θ(n)…t(1) = t(0) + θ(n),所以t(n) = t(n-1) + θ(n) = t(n-2) + 2θ(n) = t(n-3) + 3θ(n) = …=t(0) + nθ(n) = θ(n ^2),利用代換法檢驗,t(n) = θ(n ^2)。
快速排序在最壞劃分情況下的執行時間是θ(n ^2),也就是說,快速排序演算法的最壞情況執行時間並不比插入排序的更好。但需注意的是,當輸入陣列已經完全排好序時,快速排序的執行時間為θ(n ^2),而插入排序的執行時間為θ(n)。
最佳情況劃分
在partition可能做的最平衡的劃分中,得到的兩個子問題的大小都不可能大於n/2,因為其中乙個子問題的大小為 ⌊n / 2⌋,另乙個子問題的大小為⌈n / 2 ⌉ - 1。這是,執行時間的遞迴表達為:t(n) ≤ 2t(n/2) + θ(n)。根據主定理,a=2,b=2,nlog(b)a = n,所以屬於情況2,t(n) = θ(nlgn)。
快速排序的隨機化版本:
randomized-partition(a, p, r)
1. i <-- random(p, r)
2. exchange a[r] <--> a[i]
3. return partition(a, p, r)
randomized-quicksort(a, p, r)
if p < r
then q <-- randomized-partition(a, p, r)
randomized-quicksort(a, p, q-1)
randomized-quicksort(a, q+1, r)
演算法導論 第7章 快速排序
一 快速排序演算法的基本特性 時間複雜度 o n lgn 最壞 o n 2 空間複雜度 o n lgn 不穩定。快速排序是一種排序演算法,對包含n個數的輸入陣列,平均時間為o nlgn 最壞情況是o n 2 通常是用於排序的最佳選擇。因為,排序最快,也只能達到o nlgn 二 快速排序演算法的描述 ...
演算法導論 第7章快速排序
1 演算法描述 快速排序也是基於分治模式的,下面是乙個典型子陣列a p.r 排序的分治過程,主要分為三個步驟 1 分解 將陣列a p.r 劃分成兩個子陣列a p.q 1 和a q 1.r 使得前乙個陣列中每個值都小於等於a q 後乙個陣列每個值都大於a q 下標q也在這個分解過程中求得。2 解決 通...
《演算法導論》筆記 第7章 7 4快速排序分析
利用randomized partition,快速排序演算法期望的執行時間當元素值不同時,為o nlgn 7.4 1 證明 在遞迴式 中,t n n 2 採用代換法。猜測 t n c n 2,c為某個常數。選擇足夠大的c,使得 c 2 n 1 可以支配 n t n c n 2成立。7.4 2 證明 ...