【问题标题】:Radix Sort, Sorting a float data基数排序,对浮点数据进行排序
【发布时间】:2011-01-09 18:25:06
【问题描述】:

基数排序是否能够对浮点数据进行排序,例如 0.5、0.9、1.02 等?

【问题讨论】:

  • 我想通过将它的桶减少为 0 和 1 来实现基数排序,这意味着我会将每个输入转换为其二进制值,然后继续进行基数排序,这是否是加快其排序或者这会使基数排序比以前慢一点?谢谢。
  • 您所描述的是“二进制基数排序”。对于 32 位 float 数据,它将执行 32 次传递。 2**32 大约是 40 亿,所以除非你有那么多数据,否则像合并排序这样的 O(N lgN) 排序可能会更快。 (64位doubles,上限为180亿)

标签: algorithm radix-sort


【解决方案1】:

是的,这是可能的。它需要额外的通过才能正确处理负值。 Pierre TerdimanMichael Herf 的文章详细讨论了如何实现它。简而言之,您将浮点数转换为无符号整数,对其进行排序,然后将它们转换回浮点数(这是必需的,否则负值将错误地排在正值之后)。

他们的方法的优点是您不会在数据中引入任何错误(前提是您的处理器根据 IEEE 754 标准存储浮点数)。

【讨论】:

  • 这是另一篇有趣的文章 (seven-degrees-of-freedom.blogspot.com/2010/07/…),将基数排序与合并排序的 SPU 并行版本进行了比较。总之,归并排序虽然更复杂(复杂度是 O(n log n) 与基数排序的 O(n) 相比),但可以更容易并行化并最终获胜。
【解决方案2】:

不是开箱即用的,但您有一些选择。您可以离散化数据,例如,通过乘以 100 并四舍五入(对于上面的示例,您将拥有 5、9 和 102)。您还可以对数据进行分桶(按范围对数字进行分组,如 0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-26
    • 2013-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多