Java 使用基数排序进行排序

Java 使用基数排序进行排序,java,radix-sort,Java,Radix Sort,我正在读第三个循环的中的基数排序: for (i = n - 1; i >= 0; i--) { output[freq[(arr[i] / place) % range] - 1] = arr[i]; freq[(arr[i] / place) % range]--; } 为什么他们从末尾开始,因为当我试图从0开始时,它给出了错误的答案?任何解释或解决方案都将不胜感激。因为freq包含范围内每个位置的元素累积数量。也就是说,对于i=0-9的范围,freq[i]包含放置在

我正在读第三个循环的
中的
基数排序

for (i = n - 1; i >= 0; i--) {
    output[freq[(arr[i] / place) % range] - 1] = arr[i];
    freq[(arr[i] / place) % range]--;
}

为什么他们从末尾开始,因为当我试图从0开始时,它给出了错误的答案?任何解释或解决方案都将不胜感激。

因为
freq
包含范围内每个位置的元素累积数量。也就是说,对于i=0-9的范围,
freq[i]
包含放置在位置
0,…,i
上的位数

该算法使用
freq
跟踪从初始数组到每个位置的输出数组需要绘制多少项

假设10,21,17,34,44,11654123作为输入,运行第一个不重要数字的计数排序:

0: 10
1: 21 11
2:
3: 123
4: 34 44 654
5:
6:
7: 17
8:
9: 
freq
应为:

0: 1
1: 3
2: 3
3: 4
4: 7
5: 7
6: 7
7: 8
8: 8
9: 8
因此,数组变为10,21,11123,34,44654,17


由于
freq
是如何构建的,因此需要向后循环以保持数字的原始顺序。假设您希望将34放置在输出的正确位置。根据
freq
数组,如果向前循环,您将把它放在第7个位置,这是不正确的。如果你向后循环,在到达34之前,你已经放置了654和44,因此
freq[4]=5
到那时哪个位置是正确的。

如果我想从索引1到数组大小运行循环,该怎么办?这就是我所说的“向前循环”。您不能通过前向循环来保持bucket的“原始顺序”。您只能通过循环“向后”来实现这一点。