对 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 位数字使用基数排序的主要内容,如果未能解决你的问题,请参考以下文章