快排--java實現
快速排序思想
快速排序的思想,尋找一個軸位,比這個軸小的放到左邊,比這個軸大的放到右邊,然後分別再對兩邊進行如此的方法即可得到排序的陣列。
這樣說起來晦澀難懂,我們舉個例子來實現。
例如陣列:{13,19,9,5,12,8,7,4,21,2,6,11},選取末位11為軸,
第一次遍歷得到:{13,19,9,5,12,8,7,4,21,2,6,11}
第二次遍歷得到:{13,19,9,5,12,8,7,4,21,2,6,11}
第三次遍歷得到:{9,19,13,5,12,8,7,4,21,2,6,11}
第四次遍歷得到:{9,5,13,19,12,8,7,4,21,2,6,11}
第五次遍歷得到:{9,5,13,19,12,8,7,4,21,2,6,11}
第六次遍歷得到:{9,5,8,19,12,13,7,4,21,2,6,11}
第七次遍歷得到:{9,5,8,7,12,13,19,4,21,2,6,11}
第八次遍歷得到:{9,5,8,7,4,13,19,12,21,2,6,11}
第九次遍歷得到:{9,5,8,7,4,13,19,12,21,2,6,11}
第十次遍歷得到:{9,5,8,7,4,2,19,12,21,13,6,11}
第十一次遍歷得到:{9,5,8,7,4,2,6,12,21,13,19,11}
最後我們把原來的軸11與中間位置12交換得到:{9,5,8,7,4,2,6,11
我們開始排列兩邊,{9,5,8,7,4,2,6} 和{21,13,19,12}
我們選取6和12分別為兩邊的軸,開始新的一輪遍歷,
第一次遍歷:{9,5,8,7,4,2,6} , {21,13,19,12}
第二次遍歷:{5,9,8,7,4,2,6} , {21,13,19,12}
第三次遍歷:{5,9,8,7,4,2,6} , {21,13,19,12}
第四次遍歷:{5,9,8,7,4,2,6} , 無
第五次遍歷:{5,4,8,7,9,2,6} , 無
第六次遍歷:{5,4,2
最後我們把原來的軸6和中間位置7交換,得到:{5,4,2,6,9,8,7} 。把原來的軸12和中間位置21交換,得到:{12,13,19,21}
我們分成了小陣列:{5,4,2} 和{9,8,7} 和{13,19,21},分別以2和7,21為軸進行新一輪的遍歷
第一次遍歷:{5,4,2} , {9,8,7} , {13,19,21} 注意:13和13自己進行交換,
第二次遍歷:{5,4,2} , {9.8.7} , {19,13,21}
最後我們把原來的軸2和中間位置5交換,得到:{2,4,5}。把原來的軸7和中間位置9交換,得到:{7,8,9}。把原來的軸21和中間位置21交換,得到{19,13,21}
我們分成小陣列:{2,4}和{7,8}和{19,13},分別以4,8,13為軸,開始新的一輪遍歷。
第一次遍歷:{2,4} , {7,8} , {19,13}
這裡已經結束遍歷,原來的軸和中間位置交換,得到{2,4} {7,8} {13,19} 。 自此遍歷結束,得到了順序的陣列。
注意:(1)這裡的“中間位置”,並不是說的位置上的中間,而是指的是軸的中間位置,也就是說,這個中間位置是左邊的比軸小,右邊的比軸大!!!
(2)這裡的紅色標誌表示交換,如果是有一個紅色的表示自己和自己交換!!!
java程式碼實現
程式設計師還是用程式碼來說事,這麼多文字,大家可能會看不下,那就看下程式碼,不明白的可以對照上面的順序來屢屢。
1 /** 2 * 快排 3 * @param arr 4 * @param low 5 * @param high 6 */ 7 private void quickS(int[] arr,int low,int high){ 8 9 if(low > high){ 10 return; 11 } 12 int mid = getMid(arr,low,high); 13 quickS(arr,low,mid-1); 14 quickS(arr,mid+1,high); 15 } 16 17 /** 18 * 獲取中間位置 19 * @param arr 待排序的陣列 20 * @param low 最低位置 21 * @param high 最高位置 22 * @return 23 */ 24 private int getMid(int[] arr,int low,int high){ 25 if(low > high){ 26 return -1; 27 } 28 int max = arr[high]; 29 int i = low; 30 int temp = 0; 31 while(low < high){ 32 if(max > arr[low]){ 33 temp = arr[i]; 34 arr[i]=arr[low]; 35 arr[low]=temp; 36 i++; 37 } 38 low++; 39 } 40 temp = arr[i]; 41 arr[i] = arr[high]; 42 arr[high] = temp; 43 return i; 44 } 45 46 @Test 47 public void testQS(){ 48 int arr[]={13,19,9,5,12,8,7,4,21,2,6,11}; 49 quickS(arr,0,11); 50 for(int i = 0; i < arr.length; i++){ 51 System.out.print(arr[i]+" "); 52 } 53 }
附上另一種方法:
/** * 快排 * @param array */ private void quickSort(int[] array){ int high = array.length-1,low=0; subSort(array,high,low); for(int i = 0; i<array.length; i++){ System.out.println(array[i]); } } private int getMiddle(int[] array,int high,int low){ int key = array[low]; while (low < high) { while (low < high && array[high] >= key){ high--; } array[low] = array[high]; while (low < high && array[low] <= key){ low++; } array[high] = array[low]; } array[low] = key; return low; } private void subSort(int[] array,int high,int low){ if(low>high){ return; } int result = getMiddle(array, high, low); subSort(array,result - 1,low); subSort(array, high,result + 1); }
總結
快速排序主要是掌握方法,其中獲取中間位置的演算法是核心演算法,這裡是排序的關鍵,做什麼事情勢必要親身嘗試,哪怕錯了可以重頭再來!!!