快速排序是效率較高的排序方法,採用了分治法。將一個大的數組分解成多個小數組,保證每個小數組是順序的,則整個大數組也就是順序的了。java
我學習的過程是這樣的:數組
1 先看了下維基百科上面的解釋。函數
2 本身分析整個過程。學習
3 寫代碼實現。ui
維基百科的解釋以下:spa
有了如上的解釋,咱們本身分析下這個過程。code
首先是有一個數組。而後咱們隨便選取一個數字做爲基準,將全部小於該數字的元素,移動到左側。全部大於該數字的元素,移動到該數字的右側。咱們這裏有個方法,就是基準元素,老是選擇這個數組序列的第一個元素。這樣的話,咱們只用將小於該數字的元素移動到左側來便可。而後以這個基準元素的下標爲基準點,將該數組分紅兩段,而後針對這兩個數組,肯定其基準,再次排序。一直到全部的元素都肯定順序後,整個排序過程結束。排序
看看整段代碼的結構。遞歸
package com.bplead.sort; public class QuickSort { public static void qsort(int a[],int begin,int end){ if(begin > end){ return; } prt(a); int pivotindex = partition(a,begin,end); qsort(a,begin,pivotindex-1); qsort(a,pivotindex+1,end); } public static int partition(int a[],int left,int right){ int keyindex = left; int temp = 0; for(int i=left+1;i<=right;i++){ if(a[i] < a[keyindex]){ temp = a[i]; for(int j=i;j>keyindex;j--){ a[j] = a[j-1]; } a[keyindex] = temp; keyindex ++; } } return keyindex; } public static void main(String[] args) { int array[] = {43,24,12,56,78,9,67,50,1,2,1,9,87}; qsort(array,0,array.length-1); } private static void prt(int[] array){ for(int i=0;i<array.length;i++) System.out.print(array[i] + " "); System.out.println(); } }
咱們看一下partition分區函數把。ip
咱們將基準元素選擇爲第一個元素,循環遍歷整個數組,使其元素和基準元素進行比較,若是遍歷的當前元素比基準元素小,則當前元素之前的全部元素(不包含當前元素)都向右移動一位,當前元素放置到基準元素之前。一個分區函數執行完成後,全部小於該基準元素的元素都會移動到基準元素左側了。
我這裏把整個快速排序的過程都打印出來了,過程以下:
43 24 12 56 78 9 67 50 1 2 1 9 87
24 12 9 1 2 1 9 43 56 78 67 50 87
12 9 1 2 1 9 24 43 56 78 67 50 87
9 1 2 1 9 12 24 43 56 78 67 50 87
1 2 1 9 9 12 24 43 56 78 67 50 87
1 2 1 9 9 12 24 43 56 78 67 50 87
1 1 2 9 9 12 24 43 56 78 67 50 87
1 1 2 9 9 12 24 43 56 78 67 50 87
1 1 2 9 9 12 24 43 56 78 67 50 87
1 1 2 9 9 12 24 43 50 56 78 67 87
1 1 2 9 9 12 24 43 50 56 78 67 87
1 1 2 9 9 12 24 43 50 56 67 78 87
1 1 2 9 9 12 24 43 50 56 67 78 87
原數組是:
43 24 12 56 78 9 67 50 1 2 1 9 87
第一次分區操做:咱們選擇43爲基準,則全部小於43的元素均在43左側。獲得以下序列。
24 12 9 1 2 1 9 43 56 78 67 50 87
第二次分區操做,將43之前的元素看成一個序列,之後的元素也看成一個序列。咱們須要注意的是,已經肯定過的這個基準元素,做爲分割數組的標記,該元素不用劃分到左右兩個數組中。