排序演算法學習 快速排序

2021-10-04 04:10:04 字數 1600 閱讀 1395

今天演算法實驗重新學習了快速排序演算法,對此有了一些理解,把它記錄在此以供日後學習。

如下為快速排序演算法被呼叫部分

int get_loc

(int arr[

],int low,int high)

} arr[low]

=arr[i]

; arr[i]

=temp;

return i;

//返回基準位置

}

演算法本質是從後往前與從前往後 同時

找到比基準值小和基準值大的數作為乙個"對子"

譬如下面例子第一次時

基準值為low值也就是5

所以從後往前 我們找到了2比5小

而從前往後 我們找到了7比5大

所以7和2就是乙個對子,我們交換他們即可

比如對於陣列arr=

arr[0]

arr[1]

arr[2]

arr[3]

arr[4]

arr[5]

arr[6]

arr[7]

5(low)716

4832(high)52

1648

3752

1348

6752

134(low,high)86

7421

35(low,high)86

7注意:

當high=6 low=3之後

high->8->4(此時4<5成立)

該low繼續尋找,此時low->4 停止

因為low已經等於high了

至此 函式第一輪結束 我們交換low,high位與基準位

額外補充說明

為什麼要先從後往前 再從前往後掃瞄

譬如 陣列為 7 2 8 9 時

如果先從前掃瞄 會出現 7 2

8 9

這時候的8 為low至此掃瞄結束 交換7與8變成了8 2 7 9 顯然是不對的

如果先從後 就是交換7和2 變成 2 7 8 9 也就佇列

下面**為呼叫部分

void

quicksort

(int arr[

],int low,int high)

}

這部分**很簡單 就是說我們進行一輪運算後就把基準值放到了它所應該在的位置

所以只需要對基準位之前 與 基準值之後繼續重複呼叫就可以了。

至於演算法複雜度等問題 日後再補上。

測試資料:隨機生成的十萬個數進行排序

測試軟體:dev

測試結果:

排序演算法學習 快速排序

快速排序 作為氣泡排序的一種改進 通過設定乙個標誌值 通常為陣列第乙個元素pivot 一次快排將陣列分成兩個部分,一部分 公升序 前一部分 小於標誌值pivot,另一部分大於標誌值 公升序 後面部分 各部分內部可以是 通常也是 無序的。通過遞迴地呼叫這樣的排序,使得最終陣列所有的元素有序。一次具體的...

演算法學習 快速排序

快速排序 分治演算法 const int n 1e6 10 int a n a 待排序陣列,l 排序陣列的起始下標,r 排序陣列的結束下標 void quick sort int a,int l,int r 遞迴的終止條件 int x a l 選取排序的比較物件 int i l 1 設定排序的左指標...

演算法學習 快速排序

1 基本思想 取待排序陣列第乙個數作為參照數,建立left和right陣列,left儲存小於參照數的陣列集合,right儲存大於參照數的陣列集合,然後分別對left和right進行遞迴呼叫排序。2 舉例 11,2,3,43,23,5,6,9,10 取任意的乙個數為基準數 temp arr 0 遍歷陣...