java排序算法(六)------快速排序

快速排序

基本思想是:通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,然後再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列

第一種方法:以第一個數爲樞紐值

public class QuickSort { public static int[] sortQuick(int[] array) { return quickSort(array, 0, array.length - 1); } private static int[] quickSort(int[] arr, int low, int heigh) { if (low < heigh) { int division = partition(arr, low, heigh); quickSort(arr, low, division - 1); quickSort(arr, division + 1, heigh); } return arr; } // 分水嶺,基位,左邊的都比這個位置小,右邊的都大 private static int partition(int[] arr, int low, int heigh) { int base = arr[low]; //用子表的第一個記錄做樞軸(分水嶺)記錄 while (low < heigh) { //從表的兩端交替向中間掃描 while (low < heigh && arr[heigh] >= base) { heigh--; } // base 賦值給 當前 heigh 位,base 挪到(互換)到了這裏,heigh位右邊的都比base大 swap(arr, heigh, low); while (low < heigh && arr[low] <= base) { low++; } // 遇到左邊比base值大的了,換位置 swap(arr, heigh, low); } // now low = heigh; return low; } private static void swap(int[] arr, int a, int b) { int temp; temp = arr[a]; arr[a] = arr[b]; arr[b] = temp; } } public class QuickSort { public static int[] sortQuick(int[] array) { return quickSort(array, 0, array.length - 1); } private static int[] quickSort(int[] arr, int low, int heigh) { if (low < heigh) { int division = partition(arr, low, heigh); quickSort(arr, low, division - 1); quickSort(arr, division + 1, heigh); } return arr; } // 分水嶺,基位,左邊的都比這個位置小,右邊的都大 private static int partition(int[] arr, int low, int heigh) { int base = arr[low]; //用子表的第一個記錄做樞軸(分水嶺)記錄 while (low < heigh) { //從表的兩端交替向中間掃描 while (low < heigh && arr[heigh] >= base) { heigh--; } // base 賦值給 當前 heigh 位,base 挪到(互換)到了這裏,heigh位右邊的都比base大 swap(arr, heigh, low); while (low < heigh && arr[low] <= base) { low++; } // 遇到左邊比base值大的了,換位置 swap(arr, heigh, low); } // now low = heigh; return low; } private static void swap(int[] arr, int a, int b) { int temp; temp = arr[a]; arr[a] = arr[b]; arr[b] = temp; } }

第二種方法:三數取中法
在這裏插入圖片描述
代碼實現:

public class QuickSort02 { public static void sort(int[] arr) { sort(arr, 0, arr.length - 1); } private static void sort(int[] arr, int left, int right) { if (left < right) { partition(arr, left, right); int pivot = right - 1; int i = left; int j = right - 1; while (true) { while (arr[++i] < arr[pivot]) { } while (j > left && arr[--j] > arr[pivot]) { } if (i < j) { swap(arr, i, j); } else { break; } } if (i < right) { swap(arr,i,right - 1); } sort(arr, left, i - 1); sort(arr,i + 1,right); } } private static void partition(int[] arr, int left, int right) { int mid = (left + right) / 2; if (arr[left] > arr[mid]) { swap(arr,left,mid); } if (arr[left] > arr[right]) { swap(arr, left, right); } if (arr[mid] > arr[right]) { swap(arr,mid,right); } swap(arr, mid, right - 1); } private static void swap(int[] arr, int i, int j) { int t = arr[i]; arr[i] = arr[j]; arr[j] = t; } } public class QuickSort02 { public static void sort(int[] arr) { sort(arr, 0, arr.length - 1); } private static void sort(int[] arr, int left, int right) { if (left < right) { partition(arr, left, right); int pivot = right - 1; int i = left; int j = right - 1; while (true) { while (arr[++i] < arr[pivot]) { } while (j > left && arr[--j] > arr[pivot]) { } if (i < j) { swap(arr, i, j); } else { break; } } if (i < right) { swap(arr,i,right - 1); } sort(arr, left, i - 1); sort(arr,i + 1,right); } } private static void partition(int[] arr, int left, int right) { int mid = (left + right) / 2; if (arr[left] > arr[mid]) { swap(arr,left,mid); } if (arr[left] > arr[right]) { swap(arr, left, right); } if (arr[mid] > arr[right]) { swap(arr,mid,right); } swap(arr, mid, right - 1); } private static void swap(int[] arr, int i, int j) { int t = arr[i]; arr[i] = arr[j]; arr[j] = t; } }