基数排序算法基本思路:
依次对关键字的第1~N位进行排序,最终完成所有关键字的排序。
每一轮基数排序分2个步骤,分配和收集。
分配是指把待排序数分配到10个桶。
收集是把桶里的数据集中起来放回待排序缓存。
public class Sorter<T extends Comparable<? super T>> {
//获得十进制数字中的某一位,右起。
private int getIntegerBit(int dig, int pos) {
int d = dig;
int power = 1;
for(int i = 0;i < pos;i ++) {
power *= 10;
}
return d%power/(power/10);
}
//基数排序要被排序的关键字容易的各位数易分解
//基本思路:依次对关键字的第1..n位进行排序最终整个关键字都完成排序。
public int radixSort(int v[]) {
for(int b = 1;b < 20;b ++) {
//决定比较是否结束。当所有数字在这个数位上都是零时结束排序过程
boolean bFinish = true;
//需要10个桶,为桶的地址分配内存
int [][] buckets = (int[][]) Array.newInstance(v.getClass(), 10);
int bucketsSize[] = new int[10];//记录每个桶的长度
Arrays.fill(buckets, null);
Arrays.fill(bucketsSize, 0);
//为每个桶分配内存
for(int i = 0;i < buckets.length;i ++) {
buckets[i] = new int[v.length];
}
//关键字分配到桶
for(int i = 0;i < v.length;i ++) {
int d = getIntegerBit(v[i],b);
int bucketSize = bucketsSize[d];
buckets[d][bucketSize] = v[i];
bucketsSize[d] ++;
if(d != 0) {
bFinish = false;
}
}
if(bFinish) {
break;
}
//把所有桶中的关键字收集起来
for(int j = 0,len = 0;j < buckets.length;j ++) {
for(int k = 0;k < bucketsSize[j];k ++) {
v[len ++] = buckets[j][k];
}
}
System.out.println(Arrays.toString(v));
}
return 0;
}
}