Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的基数算法理解_Java_Algorithm - Fatal编程技术网

Java中的基数算法理解

Java中的基数算法理解,java,algorithm,Java,Algorithm,下面是来自www.sanfoundry.com的基数算法代码。我不理解while循环中的第三个for循环:为什么int I必须反向计数,以及这个循环如何将有序元素转移到b[]。还有一个问题,如果我们将数字视为以2为基础,遵循类似的代码,该怎么办?有没有可能修改这个代码来混合正负数 public static void radixSort(int[] input){ final int N = input.length; int exp = 1; int[] b = new int[N]

下面是来自www.sanfoundry.com的基数算法代码。我不理解while循环中的第三个for循环:为什么int I必须反向计数,以及这个循环如何将有序元素转移到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; 
  }
}
publicstaticvoidradixsort(int[]输入){
最终int N=输入长度;
int exp=1;int[]b=new int[N];
int max=输入[0];
对于(int i=1;i=0;i--)b[--bucket[(input[i]/exp)%10]]=input[i];
对于(inti=0;i
  • 第三个循环是反向的,以使排序稳定

  • 将基数更改为2很简单:只需将桶数更改为2,将
    exp*=10
    替换为
    exp*=2
    ,将
    (输入[i]/exp)%10
    替换为
    (输入[i]/exp)%2

  • 要处理负数,可以使用负数的绝对值作为键分别对负数进行排序,然后将反向结果与已排序的非负数合并

您的代码片段中似乎有一个bug:
它应该是
int[]b=new int[N];
而不是
int[]b=new int[10];