基数排序分为分配和收集过程,本文的java实现采用二维数组来辅助实现分配和收集过程,参见注释基本可以理解本程序的思路
public class RadixSort {
public static void sort(int[] number, int d,int num) {
//number为要排序的数组
//d为每个关键字的取值范围
//num为每个记录的关键字个数
int k = 0;
int n = 1;
int m = 1;// 控制键值排序依据在哪一位
int[][] temp = new int[d][number.length];//第0行放关键字为0的数,第1行放关键字为1的数,。。。以此类推,只需要d行
int[] order = new int[number.length];//记录每行有几个关键字
while (m <= num) {//从右到左对关键字进行排序,有几位关键字就进行几次分配收集过程
//分配过程
for (int i = 0; i < number.length; i++) {
int lsd = ((number[i] / n) % 10);
temp[lsd][order[lsd]] = number[i];
order[lsd]++;
}
//收集过程
for (int i = 0; i < d; i++) {
if (order[i] != 0)
for (int j = 0; j < order[i]; j++) {
number[k] = temp[i][j];
k++;
}
order[i] = 0;
}
n *= 10;
k = 0;
m++;
}
}
public static void main(String[] args) {
int[] data = { 73, 22, 93, 43, 55, 14, 28, 65, 39, 81, 33, 100 };
RadixSort.sort(data, 10,3);
for (int i = 0; i < data.length; i++) {
System.out.print(data[i] + " ");
}
}
}