快速排序演算法
摘要
設要排序的[陣列]是A[0]……A[N-1],首先任意選取一個數據(通常選用陣列的第一個數)作為關鍵資料,然後將所有比它小的數都放到它前面,所有比它大的數都放到它後面,這個過程稱為一趟快速排序。值得注意的是,當陣列中有多個相同的值得時候,相對位置會在演算法結束後產生變動。
- 一趟快速排序的演算法
1)設定兩個變數i、j,[排序]開始的時候:i=0,j=n-1;
2)以第一個陣列元素作為關鍵資料,賦值給 key ,即 key =A[0];
3)從j開始向前搜尋,即由後開始向前搜尋(j--),找到第一個小於 key 的值A[j],將A[j]和A[i]互換;
4)從i開始向後搜尋,即由前開始向後搜尋(i++),找到第一個大於 key 的A[i],將A[i]和A[j]互換;
5)重複第3、4步,直到i=j; (3,4步中,沒找到符合條件的值,即3中A[j]不小於 key ,4中A[i]不大於 key 的時候改變j、i的值,使得j=j-1,i=i+1,直至找到為止。找到符合條件的值,進行交換的時候i, j指標位置不變。另外,i==j這一過程一定正好是i+或j-完成的時候,此時令迴圈結束)。
排序演示:

image.png
int[] arr = new int[]{6, 7, 10, 9, 3, 2, 10, 0, 5, 12}; quickSort(arr, 0, arr.length - 1); ************************************************************************************************************************************ public static void quickSort(int[] arr, int low, int high) { int key, l, h; if (low > high) {//遞迴演算法的出口 return; } /** * key 定義Key為指標,與Key做比較、預設第一次是arr[0] */ key = arr[low]; l = low; h = high; /** *從i++和j--兩個方向搜尋不滿足條件的值並交換 */ while (l < h) { //從右往左找 第一個小於key的值 while (l < h && arr[h] >= key) { h--; } //從左往右第一個大於等於key的值 while (l < h && arr[l] <= key) { l++; } //交換 if (l < h) { int p = arr[l]; arr[l] = arr[h]; arr[h] = p; } } ////當l==h的時候,與key交換位置 arr[low] = arr[l]; arr[l] = key; quickSort(arr, low, l - 1);//對左邊的數快排 quickSort(arr, l + 1, high);//對右邊的數快排 }
輸出結果
onCreate: 0
onCreate: 2 onCreate: 3 onCreate: 5 onCreate: 6 onCreate: 7 onCreate: 9 onCreate: 10 onCreate: 10 onCreate: 12