如何使用分布排序(基数排序等)对字符串进行排序?

Posted

技术标签:

【中文标题】如何使用分布排序(基数排序等)对字符串进行排序?【英文标题】:How to use distribution sort (radix sort, etc) to sort strings? 【发布时间】:2012-03-09 17:44:25 【问题描述】:

我知道如何使用基数排序来对整数进行排序。

但是如何使用它对字符串进行排序呢?还是浮点数?

【问题讨论】:

@NiklasB.:基数排序是一种非比较排序。 @Groo:哦。在那种情况下,我的评论是无关紧要的:) 【参考方案1】:

如果您忽略浮点数的一些特性,例如无穷大、非数字值和零的两种不同表示,则可以使用基数排序或任何其他分布排序来对浮点数进行排序。 IEEE 754-2008 浮点数具有二进制表示,在排序顺序上与整数兼容。因此,如果您排除非数字并将floatdouble 重新解释为int32int64,您可以直接对它们应用任何分布排序。 编辑:负浮点数需要特殊处理(正如 AShelly 指出的那样),因为它们的排序顺序与整数的排序顺序相反。

对于字符串,由于它们的长度可变,因此更加困难。可以使用其他类型的分布排序(桶排序)并且通常用于字符串。字符串的几个起始字符用于桶索引,然后任何比较排序用于对桶内的字符串进行排序。

如果所有字符串的长度几乎相等和/或使用某种技术来放大字符串之间的差异(如"FAST: Fast Architecture Sensitive Tree Search on Modern CPUs and GPUs" 的第 6 章所述),那么也可以使用基数排序:将字符串拆分为字符组(或者更好的是,对比特组)等长,将这些组重新解释为整数,然后继续进行,就好像它是整数的基数排序一样。

编辑: 保证各种分布排序仅适用于 ASCII 字符串。其他字符串编码可能需要不同的排序顺序,或者可能取决于语言环境的“collat​​e”参数。

【讨论】:

【参考方案2】:

是的,这是可能的。

请参阅Radix Sort, Sorting a float data 了解浮点数。它使用了浮点数转换为整数类型的事实比较正确(一旦负数被纠正)。详情见this article

对于字符串,您可以通过执行 MSD 基数排序并确保在遇到 Null 时停止降序来解决可变长度问题。见Radix sort implemented in c++ for string。

【讨论】:

以上是关于如何使用分布排序(基数排序等)对字符串进行排序?的主要内容,如果未能解决你的问题,请参考以下文章

如何对包含多个字符串的结构应用基数排序(使用计数排序)

基数排序字符串

C++:使用 LSD 基数排序对字符串进行排序崩溃

基数排序时如何使字符串粘在一起?

基数排序是不是用于后缀排序?

排序算法:Radix Sort 基数排序