Java中的基数算法理解
下面是来自www.sanfoundry.com的基数算法代码。我不理解while循环中的第三个for循环:为什么int I必须反向计数,以及这个循环如何将有序元素转移到b[]。还有一个问题,如果我们将数字视为以2为基础,遵循类似的代码,该怎么办?有没有可能修改这个代码来混合正负数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]
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
- 要处理负数,可以使用负数的绝对值作为键分别对负数进行排序,然后将反向结果与已排序的非负数合并
它应该是
int[]b=new int[N];
而不是int[]b=new int[10];