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; } }