桶排序
public static void radixSort(int[] arr, int L, int R, int digit) { final int radix = 10; int i = 0; int j = 0; //有多少个数准备多少个辅助空间 int[] bucket = new int[R - L + 1]; for (int d = 1; d <= digit; d++) { //10个空间 //count[0] 当前(d)位是0的数字有多少个 //count[1] 当前(d)位是0和1的数字有多少个 //count[2] 当前(d)位是0和1和2的数字有多少个 //count[i] 当前(d)位是0和1和2....i的数字有多少个 int[] count = new int[radix]; for (i = L; i <= R; i++) { j = getDigit(arr[i], d); count[j]++; } for (i = 1; i < radix; i++) { count[i] = count[i] + count[i - 1]; } for (i = R; j >= L; i--) { j = getDigit(arr[i], d); bucket[count[j] - 1] = arr[j]; count[j]--; } for (i = L, j = 0; i <= R; i++, j++) { arr[i] = bucket[j]; } } } public static int getDigit(int x, int d) { return ((x / ((int) Math.pow(10, d - 1))) % 10); }
桶排序实际上是记录每一位数的疵品再一次排序
digit是最大数的位数
我们首先准备一个辅助空间 然后我们统计数组中个位数出现的词频记录在count数组中 然后把count处理成前缀和 然后从右往左遍历数组 把个位数拿出来根据 词频数减一(这个是索引)填到辅助数组里面去 然后让该位置词频减1 这时所有数字出桶放入了辅助数组里面去了 然后再把bucket里面的数字放到arr里面再次入桶出桶(我的理解就是 我们可以先把数组里面的数字记录到count这个数组里面去 然后再从count这个规则把原数组的数字进行依次倒出到bucket对应位置 这就是完成了一次排序)