public class RadisSort {
public static void main(String[] args) {
int[] arr = {123,2,45,8,67,1,3456};
radixSort(arr);
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] +" ");
}
}
public static void radixSort(int[]arr){
radixSort(arr, 0, arr.length-1, maxbits(arr));
}
public static int maxbits(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;
}
public static void radixSort(int[]arr, int L, int R, int digit){
final int radix = 10;
int i=0,j=0;
// 有多少个数准备多少个辅助空间
int[] help = new int[R-L+1];
for (int d = 1; d <= digit; d++) { // 有多少位,就进出多少次
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; i >= L; i--) {
j = getDigit(arr[i],d);
help[count[j]-1] = arr[i];
count[j]--;
}
for (i = L; i <= R; i++) {
arr[i] = help[i];
}
}
}
// 得到数num, 第d位置上的数
public static int getDigit(int num, int d){
//System.out.println(num+" "+d);
return ((num / ((int)Math.pow(10,d-1)))%10);
}
}