// 最大值位数 publicstaticintmaxbits(int[] arr){ int max = Integer.MIN_VALUE; for (int i = 0; i < arr.length; i++) { max = Math.max(max, arr[i]); } int res = 0; while (max != 0) { res++; max /= 10; } return res; }
// arr[L..R]排序 , 最大值的十进制位数digit publicstaticvoidradixSort(int[] arr, int L, int R, int digit){ finalint radix = 10; int i = 0, j = 0; // 有多少个数准备多少个辅助空间 int[] help = newint[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~i)的数字有多少个 int[] count = newint[radix]; // count[0..9] for (i = L; i <= R; i++) { // 103 1 3 // 209 1 9 j = getDigit(arr[i], d); count[j]++; // count数组先按照位数计数 } for (i = 1; i < radix; i++) { count[i] = count[i] + count[i - 1]; // count转变成累加和,累加和:大于等于当前数个数 } for (i = R; i >= L; i--) { // 原数组从右往左遍历,利用累加和可以直接找到应该在的位置 j = getDigit(arr[i], d); help[count[j] - 1] = arr[i]; // 当前数应该在的位置就是相应累加和-1的位置 count[j]--; // 使用完之后把相应位置累加和-1 } for (i = L, j = 0; i <= R; i++, j++) { arr[i] = help[j]; // 辅助空间 -> 原始数组 } } }
// 指定位,大小 publicstaticintgetDigit(int x, int d){ return ((x / ((int) Math.pow(10, d - 1))) % 10); }