如何使用分布排序(基数排序等)对字符串进行排序?
Posted
技术标签:
【中文标题】如何使用分布排序(基数排序等)对字符串进行排序?【英文标题】:How to use distribution sort (radix sort, etc) to sort strings? 【发布时间】:2012-03-09 17:44:25 【问题描述】:我知道如何使用基数排序来对整数进行排序。
但是如何使用它对字符串进行排序呢?还是浮点数?
【问题讨论】:
@NiklasB.:基数排序是一种非比较排序。 @Groo:哦。在那种情况下,我的评论是无关紧要的:) 【参考方案1】:如果您忽略浮点数的一些特性,例如无穷大、非数字值和零的两种不同表示,则可以使用基数排序或任何其他分布排序来对浮点数进行排序。 IEEE 754-2008 浮点数具有二进制表示,在排序顺序上与整数兼容。因此,如果您排除非数字并将float
或double
重新解释为int32
或int64
,您可以直接对它们应用任何分布排序。 编辑:负浮点数需要特殊处理(正如 AShelly 指出的那样),因为它们的排序顺序与整数的排序顺序相反。
对于字符串,由于它们的长度可变,因此更加困难。可以使用其他类型的分布排序(桶排序)并且通常用于字符串。字符串的几个起始字符用于桶索引,然后任何比较排序用于对桶内的字符串进行排序。
如果所有字符串的长度几乎相等和/或使用某种技术来放大字符串之间的差异(如"FAST: Fast Architecture Sensitive Tree Search on Modern CPUs and GPUs" 的第 6 章所述),那么也可以使用基数排序:将字符串拆分为字符组(或者更好的是,对比特组)等长,将这些组重新解释为整数,然后继续进行,就好像它是整数的基数排序一样。
编辑: 保证各种分布排序仅适用于 ASCII 字符串。其他字符串编码可能需要不同的排序顺序,或者可能取决于语言环境的“collate”参数。
【讨论】:
【参考方案2】:是的,这是可能的。
请参阅Radix Sort, Sorting a float data 了解浮点数。它使用了浮点数转换为整数类型的事实比较正确(一旦负数被纠正)。详情见this article
对于字符串,您可以通过执行 MSD 基数排序并确保在遇到 Null 时停止降序来解决可变长度问题。见Radix sort implemented in c++ for string。
【讨论】:
以上是关于如何使用分布排序(基数排序等)对字符串进行排序?的主要内容,如果未能解决你的问题,请参考以下文章