劍指offer-快速排序
阿新 • • 發佈:2019-01-25
package case99_QuickSort; public class QuickSortOpt { /** * 對快排進行優化 優化1:三數取中優化 優化2:優化小陣列時的排序方案 優化3:優化遞迴 * * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub int[] arr = { 9, 9, 5, 8, 3, 7, 4, 6, 2 }; Qsort(arr); for (int i = 0; i < arr.length; i++) System.out.print(arr[i] + " "); } // 排序 public static void Qsort(int[] arr) { if (arr == null) return; if (arr.length == 0) return; // 快速排序 QS(arr, 0, arr.length - 1); } // 採用遞迴的方式完成排序 public static void QS(int[] arr, int low, int high) { // 優化2:陣列個數大於一定個數的時候,採用快速排序;否則,採用直接插入排序。 int Distance = high - low; if (Distance > 7) { while (low < high) { // 優化3:優化遞迴操作 // 獲取中樞值的位置,並且完成大小陣列的劃分 int pivotPos = partition(arr, low, high); QS(arr, low, pivotPos - 1); low = pivotPos + 1; // 優化3:採用迭代的方法,可以縮減棧的深度。 } } else // 直接插入排序 InsertSort(arr, low, high); } // 直接插入 public static void InsertSort(int[] arr, int low, int high) { if (low < high) { for (int i = low; i < high; i++) { if (arr[low + 1] < arr[low]) { int temp = arr[low + 1]; // 記錄後移 int j; for (j = low + 1; temp < arr[j]; j--) { arr[j] = arr[j - 1]; } arr[j] = temp; } } } } // 獲取中樞值的位置,並且完成大小陣列的劃分 public static int partition(int[] arr, int low, int high) { // 優化1:三數取中 int m = low + (high - low) / 2; if (arr[m] > arr[high]) // 小的數放到low的位置 swap(arr, m, high); if (arr[low] > arr[high]) swap(arr, low, high); if (arr[low] > arr[m]) swap(arr, low, m); int pivotKey = arr[low]; // 從兩頭向中間開始交替靠近 while (low < high) { while (low < high && arr[high] >= pivotKey) high--; arr[low] = arr[high]; while (low < high && arr[low] <= pivotKey) low++; arr[high] = arr[low]; } arr[low] = pivotKey; return low; } // 完成low,high位置兩個數的交換 public static void swap(int[] arr, int low, int high) { int temp; if (arr[low] > arr[high]) { temp = arr[low]; arr[low] = arr[high]; arr[high] = temp; } } }