import cn.idestiny.util.GeneratedArray; /** * @Auther: FAN * @Date: 2018/8/26 19:48 * @Description:快速排序 **/ public class QuickSort { public static void main(String[] args) { int[] arr = GeneratedArray.randomGeneratedArray(1, 10, 1000000); long start = System.currentTimeMillis(); quickSort(arr); GeneratedArray.isSorted(arr); System.out.println(System.currentTimeMillis() - start); } private static void quickSort(int[] arr) { quickSort(arr, 0, arr.length - 1); } private static void quickSort(int[] arr, int left, int right) { // if(left>=right){ // return; // } //当数组长度过小时,采用插入排序,这样可以优化排序速度 if (right - left <= 15) { insertionSort(arr, left, right); return; } //进行partition int p = partition(arr, left, right); //递归左范围 quickSort(arr, left, p - 1); //递归右范围 quickSort(arr, p + 1, right); } /** * 对arr[left...right]部分进行partition操作 * 简单快速排序算法 * @param arr * @param left * @param right * @return 返回p, 使得arr[left...p-1]<arr[p] arr[p+1...right]>arr[p] */ private static int partition(int[] arr, int left, int right) { //随机选择数组中一个位置,与数组首位进行交换, GeneratedArray.swap(arr, left, (int) (Math.random() * (right - left + 1)) + left); //选择数组中第一个元素作为标志 int v = arr[left]; //arr[left+1...j] < v arr[j+1...right]>v int j = left; for (int i = left + 1; i <= right; i++) { if (arr[i] < v) { //如果arr[i] < v 那么就把arr[i]加入到[left+1...j]中 GeneratedArray.swap(arr, j + 1, i); j++; } } GeneratedArray.swap(arr, j, left); return j; } private static void insertionSort(int[] arr, int left, int right) { for (int i = left + 1; i <= right; i++) { int key = arr[i]; int j = i - 1; while (j >= 0 && arr[j] > key) { arr[j + 1] = arr[j]; j--; } arr[j + 1] = key; } } }