快速排序分治函式過程總結

2021-07-05 23:03:25 字數 1424 閱讀 2260

假設我們已經知道快速排序的演算法框架時,我們已經可以從巨集觀地去掌握快速排序演算法的思想。但是快速排序演算法的關鍵還是在於劃分操縱,同時快速排序的效能主要取決於劃分操作的好壞。快速排序分治partition過程有兩種方法:

1)兩個下標分別從首、尾向中間掃瞄的方法

2)兩個指標索引一前一後逐步向後掃瞄的方法

因為我常用第一種,因此,我拿第一種來進行分析,就以下這段**分析:

1

int partition(elemtype r,int low,int

high)

213 a[low]=pivot;//

基準記錄已被最後定位

14return low;//

return high也是可以

15 }

每次呼叫一次快速排序,都要進行劃分。而每次劃分時候,在劃分函式中將發生以下事情:

1、從傳進函式的陣列中,取乙個數作為樞軸(假設是low下標指向的元素),同時宣告乙個變數來儲存樞軸,我們可以認為我們已經從陣列中抽掉乙個元素。此時,陣列中low位置認為為空。這就給下面的迴圈創造條件。

對應函式中的語句:

elemtype pivot = r[low];//

儲存樞軸

2、這是乙個迴圈體(迴圈(1)與(2)),直到不滿足low

(1)因為我們假設樞軸元素為low,那麼首次就先從high開始向前面掃瞄,尋找乙個小於樞軸 pivot 的元素。當找到的時候,將high指向的元素調到low處空位子,此時high的位置視為空位子。

while(low=pivot)//

從右邊尋找小於樞軸的值

--high;

r[low]=r[high];//填補low位上的空缺

(2)然後,從左向右掃瞄,尋找大於樞軸 pivot的元素。當找到時候,將low指向的元素調到(1)留下的空位high。此時low處為空。

while(low//

從左邊尋找大於樞軸的值

++low;

r[high]=r[low];//

填充high處空缺

3、當上述迴圈結束後,原來程式試圖填補那個空缺最後還是沒填上,有一種捉襟見肘的感覺。而這個時候,在中間的那個空位置,左邊的數全部小於右邊的數。這個空位子理所當然就是樞軸所屬,因此完成了一次劃分,樞軸元素在本次劃分中排在了自己最終的位置上。

4、此時,high與low都指向pivot位置,因此返回給快排函式,最為快排演算法中遞迴呼叫的新的邊界。

a[low]=pivot;//

基準記錄已被最後定位

return low;//

return high也是可以

還有,我們在劃分的過程中,所有與樞軸相同的元素不會移動。

第二種方法有待總結。

手與大腦的距離決定了理想與現實的相似度

方法 函式 過程

封裝了一段邏輯 或者實現特定的功能 方法可以重複被呼叫 增加了 的復用 提公升開發效率 方法五要素 修飾詞 返回值型別 方法名 引數列表 main函式 public static void main string args 修飾詞 public static 返回值型別 void 表示該函式沒有返回...

分治 快速排序

快速排序陣列元素的思想 1 設k a 0 將k挪到適當位置,使得比k小的元素都在k左邊,比k大的元素都在k右邊,和k相等的,不關心在k左右出現均可 o n 時間完成 2 把k左邊的部分快速排序 3 把k右邊的部分快速排序 class program quicksort a,0,a.length 1 ...

分治 快速排序

快速排序陣列元素的思想 1 設k a 0 將k挪到適當位置,使得比k小的元素都在k左邊,比k大的元素都在k右邊,和k相等的,不關心在k左右出現均可 o n 時間完成 2 把k左邊的部分快速排序 3 把k右邊的部分快速排序 class program quicksort a,0,a.length 1 ...