Java中的基数算法理解

时间:2014-10-25 13:29:16

标签: java algorithm

以下是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; 
  }
}

1 个答案:

答案 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];