選擇一個關鍵值做爲基準值。比基準值小的都在左邊序列(通常是無序的),比基準值大的都在右邊(通常是無序的)。通常選擇序列的第一個元素。java
一次循環:從後往前比較,用基準值和最後一個值比較,若是比基準值小的交換位置,若是沒有繼續比較下一個,直到找到第一個比基準值小的值才交換。找到這個值以後,又從前日後開始比較,若是有比基準值大的,交換位置,若是沒有繼續比較下一個,直到找到第一個比基準值大的值才交換。直到從前日後的比較索引>從後往前比較的索引,結束第一次循環,此時,對於基準值來講,左右兩邊就是有序的了。重複上述循環。spa
public class maxtest { public static void main(String[] args) { //###################快速排序法start###################// int[] state = {2,13,7,6,15,9,10,12,3,16,8,11,14,5,1}; int start = 0; int end = state.length-1; System.out.print("初始值:"); for (int i = 0; i < state.length; i++) { System.out.print(state[i]+","); } System.out.println(""); sort(state,start,end); //###################快速排序法end###################// } public static int partition(int []array,int lo,int hi){ //固定的切分方式 int key=array[lo]; while(lo<hi){ while(array[hi]>=key&&hi>lo){//從後半部分向前掃描 hi--; } array[lo]=array[hi]; while(array[lo]<=key&&hi>lo){ lo++; } array[hi]=array[lo]; } System.out.println(""); for (int i = 0; i < array.length; i++) { System.out.print(array[i]+","); } array[hi]=key; return hi; } public static void sort(int[] array,int lo ,int hi){ if(lo>=hi){ return ; } int index=partition(array,lo,hi); sort(array,lo,index-1); sort(array,index+1,hi); } }
結果以下:code
初始值:2,13,7,6,15,9,10,12,3,16,8,11,14,5,1, 1,13,7,6,15,9,10,12,3,16,8,11,14,5,13, 1,2,5,6,3,9,10,12,9,16,8,11,14,15,13, 1,2,3,6,6,7,10,12,9,16,8,11,14,15,13, 1,2,3,5,6,7,8,9,9,16,12,11,14,15,13, 1,2,3,5,6,7,8,9,10,16,12,11,14,15,13, 1,2,3,5,6,7,8,9,10,13,12,11,14,15,13, 1,2,3,5,6,7,8,9,10,11,12,11,14,15,16, 1,2,3,5,6,7,8,9,10,11,12,13,14,15,16, 1,2,3,5,6,7,8,9,10,11,12,13,14,15,16,
圖列以下:排序
重複上述方式便可索引