实现了一个基于数组的基数排序工具类,备用。
public class ArrayBasedRadixSort {
//M是基数, 数字的每一位为0..M-1
private int M = 0;
//EXP[i]=M^i;
private int[] EXP = null;
//初始化
public ArrayBasedRadixSort(int M) {
this.M = M;
EXP = new int[M];
EXP[0] = 1;
for ( int i=1; i<M; i++ ) EXP[i] = M*EXP[i-1];
}
//取一个数的第K位
private int getKth(int x, int k) {
return ( x / EXP[k] % M );
}
//按照数的第K位进行一轮基数排序
public void round(int[] input, int N, int K) {
int[] count = new int[M]; //每个桶的大小
int[] pos = new int[M]; //每个桶的初始位置偏移量
int[] bucket = new int[N]; //包含所有桶的数组
for ( int i=0; i<M; i++ ) count[i] = 0;
for ( int i=0; i<N; i++ ) count[getKth(input[i],K)]++;
pos[0] = 0; for ( int i=1; i<M; i++ ) pos[i] = pos[i-1]+count[i-1];
for ( int i=0; i<N; i++ ) count[getKth(input[i],K)]++;
for ( int i=0; i<N; i++ ) bucket[pos[getKth(input[i],K)]++] = input[i];
for ( int i=0; i<N; i++ ) input[i] = bucket[i];
}
//进行R轮基数排序
public void radixSort(int[] input, int R) {
int N = input.length;
for ( int k=0; k<R; k++ ) {
round(input, N, k);
}
}
//测试
public static void main(String[] args) {
int[] input = {299,358,277,446,55};
ArrayBasedRadixSort inst = new ArrayBasedRadixSort(10);
inst.radixSort(input, 3);
for ( int x : input ) {
System.out.printf("%d ",x);
}
}
}