快速排序--java實現
阿新 • • 發佈:2019-01-08
一次迴圈:從後往前比較,用基準值和最後一個值比較,如果比基準值小的交換位置,如果沒有繼續比較下一個,直到找到第一個比基準值小的值才交換。找到這個值之後,又從前往後開始比較,如果有比基準值大的,交換位置,如果沒有繼續比較下一個,直到找到第一個比基準值大的值才交換。直到從前往後的比較索引>從後往前比較的索引,結束第一次迴圈,此時,對於基準值來說,左右兩邊就是有序的了。
舉例:
待排序陣列: 2 4 6 3 1 5
第一次排序: 2 4 6 3 1 5 ---> 2為基準值 向右比較
第一次交換後 :1 4 6 3 2 5 2>1 與1交換位置 開始向左比較
第二次交換後 :1 2 6 3 4 5 4>2 與4交換位置 開始向右比較 右邊無比2小的數,結束第一次排序
第二次排序:1 2 6 3 4 5 以2為界,前後拆開為兩個陣列,在進行第一次排序的形式進行排序。
1 與 6 3 4 5 兩個陣列
程式碼
public class QuickSort { /** * 將陣列的某一段元素進行劃分,小的在左邊,大的在右邊 * @param a * @param start * @param end * @return */ public static int partition(int[] a, int start, int end){ //每次都以最右邊的元素作為基準值 int base = a[end]; //start一旦等於end,就說明左右兩個指標合併到了同一位置,可以結束此輪迴圈。 while(start < end){ while(start < end && a[start] <= base) //從左邊開始遍歷,如果比基準值小,就繼續向右走 start++; //上面的while迴圈結束時,就說明當前的a[start]的值比基準值大,應與基準值進行交換 if(start < end){ //交換 int temp = a[start]; a[start] = a[end]; a[end] = temp; //交換後,此時的那個被調換的值也同時調到了正確的位置(基準值右邊),因此右邊也要同時向前移動一位 end--; } while(start < end && a[end] >= base) //從右邊開始遍歷,如果比基準值大,就繼續向左走 end--; //上面的while迴圈結束時,就說明當前的a[end]的值比基準值小,應與基準值進行交換 if(start < end){ //交換 int temp = a[start]; a[start] = a[end]; a[end] = temp; //交換後,此時的那個被調換的值也同時調到了正確的位置(基準值左邊),因此左邊也要同時向後移動一位 start++; } } //這裡返回start或者end皆可,此時的start和end都為基準值所在的位置 return end; } /** * 排序--遞迴 * @param a * @param start * @param end */ public static void sort(int[] a, int start, int end){ if(start > end){ //如果只有一個元素,就不用再排下去了 return; } else{ //如果不止一個元素,繼續劃分兩邊遞迴排序下去 int partition = partition(a, start, end); sort(a, start, partition-1); sort(a, partition+1, end); } } public static void main(String[] args) { int[] a = new int[]{2,7,4,5,10,1,9,3,8,6}; sort(a, 0, a.length-1); System.out.println("排序後的結果:"); for(int i=0;i<a.length;i++){ System.out.print(a[i]+" "); } } }