如何使用分发排序(基数排序等)来排序字符串?

时间:2012-03-09 17:44:25

标签: algorithm sorting radix-sort

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

但是如何使用它来排序字符串?或浮点数?

2 个答案:

答案 0 :(得分:4)

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

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

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

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

答案 1 :(得分:3)

是的,这是可能的。

有关浮点数,请参阅Radix Sort, Sorting a float data。它使用浮点数转换为整数类型的事实正确比较(一旦负面更正)。有关详细信息,请参阅this article

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