使用基数排序进行排序

时间:2017-09-01 09:23:12

标签: java radix-sort

我在here阅读radix sort我在第3 for loop时感到困惑:

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

为什么他们从最后开始,就像我试图从0开始一样,它给了我错误的答案?任何解释或解决方案都将不胜感激。

1 个答案:

答案 0 :(得分:2)

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

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

假设10,21,17,34,44,11,654,123作为输入,对第一个无效数字运行count-sort:

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,11,123,34,44,654,17。

您需要向后循环以保持具有相同数字的原始数字顺序,因为freq是如何构建的。假设您要将34放在输出的正确位置。根据{{​​1}}数组,如果循环前进,则将其放在第7个位置,这是不正确的。如果你向后循环,你已经在到达34之前已经放置了654和44,那么freq到那时是正确的位置。