【发布时间】:2016-11-17 09:57:07
【问题描述】:
您如何在基数 R(例如)中为以下向量实现 Radix sort:
vec <- c(25, 478, 34, 9021, 6, 9947, 504, 22)
总的来说,基数排序做了以下事情:
- 根据
unit位置排序:9021 22 34 504 25 6 9947 478 - 根据
ten位置排序:504 6 9021 22 25 34 9947 478 - 根据
hundred位置排序:6 9021 22 25 34 478 504 9947 - 根据
thousand位置排序:6 22 25 34 478 504 9021 9947
等等。当然,vec 只是一个示例,该解决方案能够处理包含任意长度数字的任意长度数据。
输出将是vec 升序(或降序)排序。也就是说,
6 22 25 34 478 504 9021 9947
【问题讨论】:
-
除非您特别希望在 R 中实现基数排序,否则在 R 3.3.0 中包含基数排序(来自“data.table”)——
sort(vec, method = "radix") -
@alexis_laz 是的,我对实现算法特别好奇。它的原理在算法上很漂亮。
-
作为一种简单的、更多计数的排序方式,参见
rep(seq_len(max(vec)), tabulate(vec))(其中,对于大整数,它将需要大量内存),它基本上只是将整数放入桶中并选择非零元素 -
@alexis_laz 也不错,但归零失败。
-
你是对的,是的。使用零,您可以使用像 +/- 1 (
rep(seq_len(max(vec) + 1), tabulate(vec + 1)) - 1) 这样的廉价技巧,尽管可能会有更多缺陷(除了内存)
标签: r sorting vector radix-sort