算法之快速排序

快速排序(Quick Sort):快速排序算法是基於分治策略的另外一個排序算法。其基本思想是,對於輸入的子數組a[p:r],按如下三個步驟進行排序:算法

  (1)分解(Divide):以a[p]爲基準元素將a[p:r]劃分紅3段a[p:q-1],a[q],和a[q+1:r],使a[p:q-1]中任何一個元素都小於等於a[q],而a[q+1:r]中任何一個元素都大於等於a[q]。下標q在劃分過程當中肯定數組

  (2)遞歸求解(Conquer):經過遞歸調用快速排序算法分別對a[p:q-1]和a[q+1:r]進行排序。ide

  (3)合併(Merge):因爲對a[p:q-1]和a[q+1:r]的排序是就地進行的,因此在a[p:q-1]和a[q+1:r]都已排好的序後,不須要執行任何計算,a[p:r]就已排好序函數

基於這個思想,能夠實現快速排序算法以下:學習

1 private static int[] quickSort(int[] a,int l,int r){
2     if(l < r){
3         int q = partition(a,l,r);
4         quickSort(a,l,q-1);
5         quickSort(a,q+1,r);
6     }
7     return a;
8 }

上述算法中的函數Partition,以一個肯定的基準元素a[pivot]對子數組a[l:r](我的比較習慣用l,r)進行劃分,它是快速排序算法的關鍵,代碼以下:測試

 1 private static int partition(int[] a,int l,int r){
 2     int i = l;
 3     int j = r;
 4     int pivot = a[l];
 5     int temp;
 6     System.out.println("開始時pivot="+pivot); //查看開始時的pivot,非必要
 7     while(true){
 8         while(a[i] <= pivot && i < r)
 9             ++i;   //i一直向後移動,直到出現a[i]>pivot
10         System.out.println("i="+i); //查看當前的i,非必要
11         while(a[j] > pivot)
12             --j;   //j一直向前移動,直到出現a[j]<pivot
13         System.out.println("j="+j); //查看當前的j,非必要
14         if(i >= j) break;
15         temp = a[i];      //交換a[i]和a[j]
16         a[i] = a[j];
17         a[j] = temp;
18         System.out.print("中間過程的數組:");
19         for(int m:a)
20             System.out.print(m+" ");         //輸出每次更改成止後的數組,非必要
21         System.out.println();
22     }
23     a[l] = a[j];
24     a[j] = pivot;
25     System.out.println("結束時pivot="+pivot);  //查看循環結束時的pivot,非必要
26     System.out.print("Partition結束後的數組:");
27     for(int m:a)
28         System.out.print(m+" ");            //輸出Partition結束後的數組,非必要
29     System.out.println();
30     return j;
31 }

我在一些地方安插了輸出語句來監測數組以及一些重要變量的變化,讀者能夠根據這些輸出語句,一步一步地理解快排的工做過程。ui

如下是測試代碼:spa

1 public static void main(String[] args) {
2     int[] a = {73,12,87,43,25,93,32,26,57,65};
3     int[] b = quickSort(a,0,a.length-1);
4     for(int i : b)
5         System.out.print(i+" ");
6 }

因爲添加了不少輔助理解用的輸出語句,結果的輸出比較長,就不貼出來了,有興趣學習快速排序的讀者能夠把這段代碼運行一次,也會有不少收穫!code

若有不對的地方或對該算法有更好的建議,請指出!blog

相關文章
相關標籤/搜索