对 32 位数字使用基数排序

Posted

技术标签:

【中文标题】对 32 位数字使用基数排序【英文标题】:using radix sort on 32bit numbers 【发布时间】:2014-01-01 19:44:01 【问题描述】:

我想知道,当我有一个整数列表并且我需要对它们进行排序时, 而且我知道它们是 32 位整数,我可以使用基数排序(将计数排序作为其稳定排序)在 o(n) 时间内对它们进行排序吗?

不就是使用从 LSB 开始的数字上的位表示来进行 32 次计数排序吗?

我知道以前不知道数字的一般排序需要 o(nlogn),但它们是 32 位整数的事实不是我需要使它成为 o(n) 排序吗?

谢谢!

【问题讨论】:

可以,但是您的内存使用量可能会变得很大。基准。对于较小的 n,由于开销,这将比 nlogn 搜索慢。它变得更好的点(如果有的话)是您自己找到的,并且取决于您的目标机器的各个位的相对速度。 你可以使用Least significant digit radix sort,它需要o(nk)时间。 基数排序只是O(n),因为您可以(有时)将log(n) 组件替换为常量log(maxN) 如果你不需要知道每个有多少,即一个排序集,你可以使用几个 BitSet。 【参考方案1】:

是的!基数排序适用于无符号整数,也适用于有符号整数(稍加工作)。

有趣的是,如果它们的位被重新解释为整数,它也适用于非 NaN、非负浮点数。 (负浮点数需要更多的工作,而且可能不值得。)

【讨论】:

这是Java,你在哪里找到“无符号”整数? 通用计算机科学。教人钓鱼等等。 @ElliottFrisch - 他们没有 RSA 签名,因此“未签名”。 基数排序可以正常工作,但它会在 o(n) 时间内工作吗?我的意思是,你可以说我用 log(n) 位来表示 0-n 范围内的整数,但是有了这些假设,知道我在 32 位整数系统上工作,我可以肯定地说基数排序是 o(n)? @Guy 是的。将可能的整数个数固定为常数,基数排序为 O(n)。 (顺便提一下,注意大写 O;“little-o”是不同的东西,几乎可以肯定不是你的意思。)

以上是关于对 32 位数字使用基数排序的主要内容,如果未能解决你的问题,请参考以下文章

9经典算法基数排序

基数排序(数字排序和英文字母排序)

基数排序(radixSort)

基数排序如何用于 32 位(或更高)整数排序?

在 uint64 中对 38 位进行基数排序?

数据结构——基数排序