選擇一個基準元素,一般選擇第一個元素或者最後一個元素,經過一次掃描,將待排序列分紅兩部分,一部分比基準元素小,一部分大於等於基準元素,此時基準元素在器拍好序後的正確位置,而後在用一樣的方法遞歸地劃分的兩部分。 java
package test.algorithm.FastSlowPointer; public class QuickSort { /** * 元素交換 * @param k * @param low * @param high */ public static void swap(int k[], int low, int high) { int temp; temp = k[low]; k[low] = k[high]; k[high] = temp; } /** * 劃分 * @param list * @param low * @param high * @return */ public static int partition(int[] list,int low,int high){ //數組的第一個做爲中值 int point = list[low]; while(low < high){ //從高位遍歷,獲取比中值小的下標(high) while(low<high && list[high]>=point){ high--; } //比中值小的記錄移到低端 list[low] = list[high]; //從低位遍歷,獲取比中值大的下標 (low) while(low<high && list[low]<=point){ low++; } //比中值大的記錄移到高端 list[high] = list[low]; } // low和hight相等,這就是point在整個排序中的位置 // 低端的都比 point小,高端的都比point大 list[low] = point; return low; } /** * 快速排序 * @param list * @param low * @param high */ public static void QSort(int[] list, int low, int high){ int point = 0; if(low < high){ //將list數組進行一分爲二 point = partition(list,low,high); //對低位序列進行遞歸排序 QSort(list,low,point-1); //對高位序列進行遞歸排序 QSort(list,point+1,high); } } /** * 快速排序 * @param list */ public static void quickSort(int[] list){ QSort(list,0,list.length-1); } public static void main(String[] args) { int[] list = {4, 2, 5, 0, 3, 9, 1, 7, 6, 8}; quickSort(list); System.out.print("打印數組:"); for(int i :list){ System.out.print(i+" "); } } }