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



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

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

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

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

如果所有字符串的长度几乎相等和/或使用某种技术来放大字符串之间的差异(如"FAST:现代 CPU 和 GPU 上的快速架构敏感树搜索"第 6 章所述(,那么也可以使用基数排序:将字符串拆分为等长的字符组(或更好的是,拆分为位组(, 将这些组重新解释为整数,并继续,就好像它是整数的基数排序一样。

编辑:保证各种分布排序仅对ASCII字符串正常工作。其他字符串编码可能需要不同的排序顺序,或者可能取决于区域设置的"collate"参数。

是的,这是可能的。

请参阅基数排序、对浮

点数数据的浮点数数据进行排序。 它使用浮点数转换为整数类型正确比较的事实(一旦更正了负数(。 有关详细信息,请参阅此文章

对于字符串,可以通过执行 MSD 基数排序并确保在遇到 Null 时停止降序来解决可变长度问题。 有关字符串,请参阅在 c++ 中实现的基数排序。

最新更新