快速排序法:java
與它的名字同樣,快速排序法排序速度相比其餘排序而言,速度更快。數組
排序規則:dom
1.將數組中的一個數據做爲基準數據,比基準數小的數據放到基準數前面,比基準數大的放到基準數後面;ide
2.建立兩個座標,一個座標從最左邊開始,一個座標從最右邊開始;ui
3.先從右邊開始找一個比基準數小的數據,找到以後,座標停在這個位置;code
4.再從左邊開始找一個比基準數大的數據,找到以後,座標也停在這個位置;blog
5.交換左右座標中的數據;排序
6.再重複以上步驟,直到左右兩邊的座標相遇;遞歸
7.將當前右邊座標中的數據與基準數交換位置;get
8.此時,已經完成了第一次排序。左邊的數據都比基準數小,右邊的數據都比基準數大;
9.分別獲取左右兩邊的數據,並遞歸執行以上步驟,最終完成整個排序;
下面直接上圖,步驟都在圖裏面:
上代碼:
/** * 快速排序法: * @author chengxp * */ public class Quick { /** * 排序入口 * * @param arrTarget * 已被分割的數組 * @param beginIndex * 被分割數據的開始下標位置 * @param endIndex * 被分割數據的結束下標位置 */ public static void entry(int[] arrTarget, int beginIndex, int endIndex) { //若只有一個數據,不用排序,直接返回 if (beginIndex - endIndex >= 0) { return; } //記錄一個座標,從左邊的位置開始 int iIndex = beginIndex; //記錄第二個座標,從右邊的位置開始 int jIndex = endIndex; //將當前已切割數組中第一個數據做爲基準數據 int target = arrTarget[beginIndex]; //當左右兩邊的數據未相遇前,保持循環 while (iIndex < jIndex) { //從右邊往左邊找一個小於/等於基準值的數據,記錄當前座標 while(target < arrTarget[jIndex] && iIndex < jIndex) { jIndex--; } //從左邊往右邊找一個大於基準值的數據,記錄當前座標 while(target >= arrTarget[iIndex] && iIndex < jIndex) { iIndex++; } //左邊和右邊的座標相遇,表示當前數組已完成了排序 if(iIndex >= jIndex) { break; } //將左右兩邊各自座標中的數據進行交換 DataProvider.changeEntry(arrTarget, jIndex, iIndex); System.out.println("changing:" + Arrays.toString(arrTarget)); } //每次循環完成後,將基準數的數據和右邊座標中的數據進行交換 DataProvider.changeEntry(arrTarget, beginIndex, jIndex); //繼續遞歸基準數左邊的數據 entry(arrTarget, beginIndex, jIndex - 1); //繼續遞歸基準數右邊的數據 entry(arrTarget, jIndex + 1, endIndex); } public static void main(String[] args) { int[] arrTarget = DataProvider.getRandomArray(9); System.out.println("before:" + Arrays.toString(arrTarget)); Quick.entry(arrTarget, 0, arrTarget.length - 1); System.out.println("after:" + Arrays.toString(arrTarget)); } }
輸出結果:
before:[56, 99, 51, 43, 87, 55, 37, 6, 29] changing:[56, 29, 51, 43, 87, 55, 37, 6, 99] changing:[56, 29, 51, 43, 6, 55, 37, 87, 99] changing:[37, 29, 6, 43, 51, 55, 56, 87, 99] after:[6, 29, 37, 43, 51, 55, 56, 87, 99]