快速排序和堆排序
快速排序思想:在partition中,首先以最右边的值作为划分值x,分别维护小于x的区间,等于x的区间,以及大于x的三个区间,最后返回划分值的左边界和右边界.时间复杂度为O(nlogn). public class QuickSort { public static void quickSort(int[] arr) { if(arr == null || arr.length < 2) return ; sortProgress(arr, 0 , arr.length - 1); } public static void sortProgress(int[] arr, int L, int R) { if(L < R) { //随机取L到R之间的一个数与R交换. swap(arr, L + (int)(Math.random() * (R - L + 1)), R); //p数组的大小为2,p[0]表示划分值的左边界,p[1]表示划分值的右边界. int[] p = partition(arr, L, R); sortProgress(arr, L, p[0] - 1); sortProgress(arr, p[1] + 1, R); } } public static int[] partition(int[] arr, int L, int R) { int less = L