使用基数排序进行排序
Sorting using radix sort
我正在阅读 radix sort
来自 this site 我在第 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 开始时,它给了我错误的答案?任何解释或解决方案将不胜感激。
因为freq
包含了范围内每个位置元素的累计个数。也就是说,对于 i=0-9 的范围,freq[i]
包含放置在位置 0, ..., i
.
上的位数
该算法使用 freq
来跟踪需要从初始数组绘制到每个位置的输出数组的项目数。
假设 10,21,17,34,44,11,654,123 作为输入,运行 第一个无意义数字的计数排序:
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 放置在输出的正确位置。根据 freq
数组,如果向前循环,你会把它放在第 7 个位置,这是不正确的。如果你向后循环,你在到达 34 之前已经放置了 654 和 44,所以 freq[4]=5
到那时才是正确的位置。
我正在阅读 radix sort
来自 this site 我在第 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 开始时,它给了我错误的答案?任何解释或解决方案将不胜感激。
因为freq
包含了范围内每个位置元素的累计个数。也就是说,对于 i=0-9 的范围,freq[i]
包含放置在位置 0, ..., i
.
该算法使用 freq
来跟踪需要从初始数组绘制到每个位置的输出数组的项目数。
假设 10,21,17,34,44,11,654,123 作为输入,运行 第一个无意义数字的计数排序:
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 放置在输出的正确位置。根据 freq
数组,如果向前循环,你会把它放在第 7 个位置,这是不正确的。如果你向后循环,你在到达 34 之前已经放置了 654 和 44,所以 freq[4]=5
到那时才是正确的位置。