演算法導論 第七章《快速排序》

2021-06-19 22:26:07 字數 1809 閱讀 1223

本章介紹了快速排序及其演算法分析,快速排序採用的是分治演算法思想,對包含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...