以下是www.sanfoundry.com的基数算法代码。我不理解while循环中的第三个for循环:为什么int必须反向计算以及此循环如何将有序元素重新分配到b []。还有一个问题,如果我们按照相似的代码将数字视为基数为2,该怎么办?是否有可能修改此代码以获得正数和负数的混合?
public static void radixSort(int[] input){
final int N = input.length;
int exp = 1; int[] b = new int[N];
int max = input[0];
for(int i = 1; i < N; i++){
if(max <= input[i]) max = input[i];
}
while(max / exp > 0){
int[] bucket = new int[10];
for(int i = 0; i < N; i++) bucket[(input[i] / exp ) % 10]++;
for(int i = 1; i < 10; i++) bucket[i] += bucket[i - 1];
for(int i = N - 1; i >= 0; i--) b[--bucket[(input[i] / exp) % 10]] = input[i];
for(int i = 0; i < N; i++) input[i] = b[i];
exp *= 10;
}
}
答案 0 :(得分:1)
反转第三个循环以使排序稳定。
将基数更改为2非常简单:只需将存储桶数量更改为2,将exp *= 10
替换为exp *= 2
,将(input[i] / exp) % 10
替换为(input[i] / exp) % 2
。
要处理负数,您可以使用绝对值作为键分别对负数进行排序,然后将反转结果与已排序的非负数合并。
看起来你的代码片段中有一个错误:
它应该是int[] b = new int[N];
而不是int[] b = new int[10];