/*** * 快速排序递归函数 * @param arrs * @param p * @param r */ private static void quickSortC(int[] arrs, int p, int r) { if (p >= r) { return; } int q = partition(arrs, p, r); quickSortC(arrs, p, q - 1); quickSortC(arrs, q + 1, r); }
/*** * 快排分区函数 * @param arr * @param p * @param r * @return */ private static int partition(int[] arr, int p, int r) { int pivot = arr[r]; int i = p; for (int j = p; j < r; j++) { if (arr[j] <= pivot) { swap(arr, i, j); i++; } } swap(arr, i, r); return i; }
/** * 交换 * * @param arr * @param i * @param j */ private static void swap(int[] arr, int i, int j) { if (i == j) { return; } int tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; }
/*** * 计数排序 * 时间复杂度:O(n) * 适用场景:待排序数据,可以分为k个桶,其中k比较小。 */ public static void countSort(int[] arrs) { int max = 0; for (int i = 0; i < arrs.length; i++) { if (arrs[i] > max) { max = arrs[i]; } } //设置桶的数量 int[] tmp = new int[max + 1]; //统计每个数字出现个数 for (int i = 0; i < arrs.length; i++) { tmp[arrs[i]]++; } //累加 for (int i = 1; i < tmp.length; i++) { tmp[i] += tmp[i - 1]; } //申请新的数组空间 int[] result = new int[arrs.length]; //依次将待排序数据放到指定位置 //必须倒着来 for (int i = arrs.length-1; i >=0; i--) { int pos = tmp[arrs[i]]--; result[pos - 1] = arrs[i]; } //拷贝回原数组 for (int i = 0; i < result.length; i++) { arrs[i] = result[i]; } }