我在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开始一样,它给了我错误的答案?任何解释或解决方案都将不胜感激。
答案 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
到那时是正确的位置。