今天演算法實驗重新學習了快速排序演算法,對此有了一些理解,把它記錄在此以供日後學習。
如下為快速排序演算法的被呼叫部分
。
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 遍歷陣...