public class RadixSort {
public static void sort(int[] number, int d) {//d表示最大的数有多少位
int k=0;
int n=1;
int m=1;//控制键值排序依据在哪一位
int[][] temp = new int[10][number.length];//数组的第一维表示可能的余数0-9
int[] order = new int[10];//数组order[i]用来表示该位是i的数的个数</span>
while(m <= d) {
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 < 10; 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, 3);
for(int i = 0; i < data.length; i++) {
System.out.print(data[i] + " ");
}
}
}
时间效率:
设待排序列为n个记录,d个关键码,关键码的取值范围为radix,则进行链式基数排序的时间复杂度为O(d(n+radix)),其中,一趟分配时间复杂度为O(n),一趟收集时间复杂度为O(radix),共进行d趟分配和收集。
空间效率:需要2*radix个指向队列的辅助空间,以及用于静态链表的n个指针。
核心点:
1、使用一个二维数组
int[][] temp = new int[10][number.length]
行是每个元素每一位可能的数字0-9,列数是待排序数组的元素个数,因为可能有所有元素某一位数字都相同的情况。
2、使用一个一维数组
int[] order = new int[10]
代表某一位相同的元素的个数,用来输出