什么时候使用基数排序合适?

Posted

技术标签:

【中文标题】什么时候使用基数排序合适?【英文标题】:When is the appropriate time to use Radix Sort? 【发布时间】:2010-03-01 09:09:57 【问题描述】:

您的数据有哪些限制才能使用基数排序?

如果我要对大量整数进行排序,是否适合使用基数排序?为什么基数排序用的不多?

【问题讨论】:

您是否有一个您希望使用它的地方的示例,但事实并非如此? 基数排序比比较排序对被比较的类型提出了更高的要求,而且并不总是明显更快。对于整数,基数可能更快。 【参考方案1】:

如果您有大量数据,其中的键受到某种限制,那就太好了。例如,当您需要对一个 100 万个 64 位数字的数组进行排序时,可以使用它按 8 个最低有效位排序,然后按接下来的 8 个,依此类推(应用 8 次)。这样这个数组就可以按 8*1M 的操作排序,而不是 1M*log(1M)。

【讨论】:

【参考方案2】:

如果您知道整数值的范围,并且它不是太大大, 也许counting sort 对你来说会是一个更好的选择。

【讨论】:

【参考方案3】:

您可能不会像您想象的那样经常看到它的一个原因是基数排序不像基于比较的排序(快速排序/合并排序/堆排序)那样通用。它要求您可以将要排序的项目表示为整数或类似整数。使用标准库时,很容易定义一个比较任意对象的比较函数。定义将任意数据类型正确映射为整数的编码可能更难。

【讨论】:

【参考方案4】:

桶排序在离散键值的数量相对于数据项的数量较小的情况下很有用,并且目标是在不干扰原始列表的情况下生成重新排序的列表副本(因此需要维护同时列出新旧版本的列表不是负担)。如果可能的键数量太大而无法在单次遍历中处理,则可以通过多次遍历将桶排序扩展为基数排序,但会失去桶排序为小键提供的大部分速度优势。

在一些外部排序的场景下,尤其是当不同key值的个数非常少(比如两个)时,需要一个稳定的排序,I/O设备只能用一个顺序的数据流高效运行,它可能有助于使 K 通过源数据流,其中 K 是键值的数量。在第一次通过时,复制键是最小合法值的所有项目并跳过其余部分,然后复制键是下一个更高值的所有项目,跳过其余部分,等等。这种方法显然非常有效如果有很多不同的键值,但如果有两个就很好了。

【讨论】:

以上是关于什么时候使用基数排序合适?的主要内容,如果未能解决你的问题,请参考以下文章

基数排序

为啥 R 使用基数排序?

什么是基数排序?

数据结构-排序之基数排序(使用java代码实现)

数据结构-排序之基数排序(使用java代码实现)

数据结构-排序之基数排序(使用java代码实现)