教你學習快速排序算法-程序員必備哦
阿新 • • 發佈:2019-03-01
測試 upload 一個 sort 中間 ogr ges 教你 sta
支持原文:https://tryenough.com/arithmetic-quitsort
舉個例子
排序這個序列:6 1 2 7 9 3 4 5 10 8
- 步驟1:選擇一個基準數作為對比的開始值,這裏選擇第一個數6:
- 步驟2、先從右往左找一個小於 6 的數,再從左往右找一個大於 6 的數。
- 步驟3、然後交換他們
變成這樣子:
繼續執行步驟2和3,直到兩個哨兵相遇,:
左右兩個哨兵都走到3:
- 步驟4:將開始選擇基準數字6換到中間,測試6左邊的數都小於6,右邊的數都大於6。完成第一次循環:
第一次完成之後,再按照此方法分別對6左右兩邊的數列進行遞歸排序即可。是不是很簡單。
看下代碼就更清晰了:
void quicksort(int a[], int left,int right) { int i,j,t,temp; if(left>right) return; temp=a[left]; //temp中存的就是基準數 i=left; j=right; while(i!=j) { //順序很重要,要先從右邊開始找 while(a[j]>=temp && i<j) j--; //再找右邊的 while(a[i]<=temp && i<j) i++; //交換兩個數在數組中的位置 if(i<j) { t=a[i]; a[i]=a[j]; a[j]=t; } } //最終將基準數歸位 a[left]=a[i]; a[i]=temp; quicksort(a, left,i-1);//繼續處理左邊的,這裏是一個遞歸的過程 quicksort(a, i+1,right);//繼續處理右邊的 ,這裏是一個遞歸的過程 }
也可以這麽寫:
/** * 快排 * @param arr * @param low * @param high * @return */ public static int[] quit(int arr[], int low, int high) { int l = low; int h = high; int key = arr[l]; //先找出一個數作為基準數(這裏取數組最中間的一位) while (l < h) { while (l < h && arr[h] >= key) h --; //從後向前:尋找比基準數小的數據,如果找到,停下來 if (l < h) { //“探測”到了符合要求的數據,則交換數據,繼續順著方向尋找 arr[l] = arr[h]; l ++; } while (l < h && arr[l] <= key) l ++; //從前向後:尋找比基準數大的數據,如果找到,停下來 if (l < h) { ////“探測”到了符合要求的數據,則交換數據,繼續順著方向尋找 arr[h] = arr[l]; h --; } } arr[l] = key; if (l > low) quit(arr, low, l - 1); if (h < high) quit(arr, h + 1, high); return arr; }
支持原文:https://tryenough.com/arithmetic-quitsort
教你學習快速排序算法-程序員必備哦