一个十进制数,每一位都是由0-9之间的数组成,生成10个桶,从个位数开始比较到最大位数,建立一个辅助数组,利用先进先出的原则出桶放在辅助数组(和原数组一样大)中,直到比较最大位数的出桶结束。
例子:013,021,011,052,062,100
第一趟进桶(个位数):0号桶 100 1号桶 021 011 2号桶 052 062 3号桶 013
第一趟辅助数组(从0号桶开始出桶,先进先出):100 021 011 052 062 013
第二趟进桶(十位数):0号桶 100 1号桶 011 013 2号桶 021 5号桶 052 6号桶062
第二趟数组:100 011 013 021 052 062
第三趟进桶(百位数): 0号桶 011 013 021 052 062 1号桶 100
第三趟数组:011 013 021 052 062 100
名词解释:累加词频表:每个词频上的值相当于小于等于这个词频的数。
例:5 个 0,2个1,那么0的词频表的值是5, 1的词频表的值是7,相当于小于等于的值有7个,有了词频表,利用先进先出的原则,词频表的值-1就是最后一个进入桶的数要放入辅助数组中的索引。
代码如下
public void sort(int[] arr,int digit){ //桶排序
int j = 0; //某一位的值
final int radix = 10; //准备10个桶
int[] help = new int[arr.length]; //辅助空间
for (int d = 1; d <=digit; d++) { //进桶出桶的次数
int[] count = new int[radix]; //词频数组
for (int i = 0; i < arr.length; i++) { //统计词频
j = getDigit(arr[i],d);
count[j]++;
}
for (int i = 1; i < count.length; i++) { //把词频表变成累加词频表
count[i] = count[i]+count[i-1];
}
for (int i = arr.length-1; i >= 0; i--) { //出桶的操作
j = getDigit(arr[i],d); //获得指定位数的值
//最后入桶的,对应词频表的长度-1当成辅助空间的索引
help[count[j]-1] = arr[i];
count[j]--; //对应词频表-1
}
for (int i = 0; i < arr.length; i++) { //复制到原数组
arr[i] = help[i];
}
}
}
public int getDigit(int x,int d){ //获得某一位的位数
return (int)(x/Math.pow(10,d-1))%10;
}
public int maxBits(int[] arr){ //获得数组中的最大值
int max = arr[0];
for (int i : arr) {
max = Math.max(i,max);
}
int count = 0;
while (max != 0){
max /= 10;
count++;
}
return count;
}