基数排序的基本思想是,先通过个位数字排序,让后根据十位数排序,,重复以上知道排序结束。
读Java算法教材,上面通过Queue来保存中间值,然而优先序列加入新元素需要log(n)的复杂度,总觉得应该有数组来代替。
其次,好多实现代码都需要给定最大的位数,要单独计算最大位数的话需要O(n)的复杂度,为什么不增加一个计数器来搞定呢?
一下是Java实现版本,目前只支持任意正整数排序。如果有更好的解决方案,请指教。
public static void radixSort(int[] arr) {
int[][] bucket = new int[10][arr.length];
int[] order = new int[10];
int n = 1, cnt = arr.length;
while (cnt > 0) {
cnt = 0;
for (int i = 0; i < arr.length; i++) {
int bit = (arr[i] / n) % 10;
bucket[bit][order[bit]] = arr[i];
order[bit]++;
if (arr[i] / n > 0)
cnt++;
}
int k = 0;
for (int i = 0; i < bucket.length; i++) {
for (int j = 0; j < order[i]; j++) {
arr[k++] = bucket[i][j];
}
order[i] = 0;
}
n *= 10;
}
}