将n个待排序的数字按照个位数装到n个桶里,桶是按照个位排序的,然后将桶里的数按顺序倒出来。接着按十位,百位,千位。。。数字进桶,最后倒出就排好序了。
代码实现如下:
public static void radixSort(int[] arr){
if(arr==null || arr.length<2){
return;
}
radixSort(arr,0,arr.length-1,maxbits(arr));
}
public static int getDigit(int num, int d) {//求num第d位上的数字,d=1对应个位
return (num / ((int) Math.pow(10, d - 1))) % 10;
}
//将arr从L到R进行排序
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++) { //进出多少次
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--){ //按照count的值算出数字在桶中的序号
j=getDigit(arr[i],d);
bucket[count[j]-1]=arr[i];
count[j]--;
}
for(i=L,j=0;i<=R;i++,j++){ //从大到小出桶
arr[i]=bucket[j];
}
}
}
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 main(String[] args) {
int[] s={3,5,8,4,1,5};
radixSort(s);
for (int i = 0; i < s.length; i++) {
System.out.print(s[i]);
}
}
其中count为位数统计的前缀和,用来表示每一位在桶中的位置,如下图所示。