本章介紹了快速排序及其演算法分析,快速排序採用的是分治演算法思想,對包含n個數的輸入陣列,最壞情況下執行時間為θ(n^2),但是平均效能相當好,期望的執行時間為θ(nlgn)。另外快速排序能夠就地排序(我理解是不需要引入額外的輔助空間,每次劃分能確定乙個元素的具體位置),在虛擬環境中能很好的工作。
快速排序演算法採用的分治演算法,因此對乙個子陣列a[p…r]進行快速排序的三個步驟為:
(1)分解:陣列a[p...r]被劃分為兩個(可能為空)子陣列a[p...q-1]和a[q+1...r],給定乙個樞軸,使得a[p...q-1]中的每個元素小於等於a[q],a[q+1...r]中的每個元素大於等於a[q],q下標是在劃分過程中計算得出的。
(2)解決:通過遞迴呼叫快速排序,對子陣列a[p...q-1]和a[q+1...r]進行排序。
(3)合併:因為兩個子陣列是就地排序,不需要合併操作,整個陣列a[p…r]排序完成。
快速排序關鍵過程是對陣列進行劃分,劃分過程需要選擇乙個主元素(pivot element)作為參照,圍繞著這個主元素進劃分子陣列。舉個列說明如何劃分陣列,現有子陣列a=,以最後乙個元素為主元素進行劃分,劃分過程如圖所示:
書中給出了劃分過程的偽**:
partition(a,p,r)
x = a[r] //將最後乙個元素作為主元素
i = p-1
for j=p to r-1 //從第乙個元素開始到倒數第二個元素結束,比較確定主元的位置
do if a[j] <= x
i = i+1
exchange a[i] with a[j]
exchange a[i+1] with a[r] //最終確定主元的位置
return i+1 //返回主元的位置
根據劃分過程的為**,書中又給出了快速排序的為**:
1 quicksort(a,p,r)
2 if p
/**created by rogerking
*email:[email protected]
*/#include using namespace std;
//劃分子陣列
int partition(int a, int p,int r) }
tmp=a[j]; //交換a[r]和a[i+1]的值
a[j]=a[i+1];
a[i+1]=tmp;
return i+1;
}//快速排序
void quicksort(int a,int p,int r)
return 0;
}
最快情況劃分:當劃分過程中產生的兩個區域分別包含n-1個元素和1個元素的時候(即將待排序的數是逆序的),這樣第個呼叫過程中每次劃分都是不對稱的。演算法時間遞迴的表示為:t(n)=t(n-1)+t(o)+θ(n) = t(n-1)+θ(n) = θ(n^2)。
/*
偽**:
randomize-partition(a,p,r)
i =random(p,r)
exchange a[r] with a[i]
return patition(a,p,r)
randomize-quicksort(a,p,r)
if p
演算法導論 第七章 快速排序
快速排序通常是實際應用中最好的選擇,因為它的平均效能非常好,它的期望時間複雜度為o nlng 而且隱含的常數因子非常小。另外,它還是原址排序。quicksort a,p,r if p隨著程式的執行,陣列被劃分為4個 小於主元,大於主元,未劃分,主元,可能有空的 區域。對於partition中的第3 ...
演算法導論第七章快速排序
一 快速排序概述 關於快速排序,我之前寫過兩篇文章,一篇是寫vc庫中的快排函式,另一篇是寫了快排的三種實現方法。現在再一次看演算法導論,發現對快速排序又有了些新的認識,總結如下 1 快速排序最壞情況下的時間複雜度為o n 2 雖然最壞情況下效能較差,但快排在實際應用中是最佳選擇。原因在於 其平均效能...
演算法導論 第七章 快速排序
1.快速排序描述 基於分治模式,分為分解 解決和合併三部分 1 分解 將陣列a p.r 劃分為兩個子陣列a p.q 1 和a q 1.r 是的a p.q 1 中每個元素都小於或等於a q 2 解決 通過遞迴呼叫快速排序,對子陣列a p.q 1 和a q 1.r 排序 3 合併 合併兩個有序的陣列,a...