sorting - 我什么时候应该选择桶排序而不是其他排序算法?

标签 sorting bucket-sort

桶排序算法什么时候是最好的排序方法?是否有根据数据结构的大小、类型来使用它们的推荐指南?

最佳答案

桶排序是一种非基于比较的排序算法,它假设可以创建桶数组并按索引将要排序的项目分配到这些桶中。因此,作为使用桶排序的先决条件,您需要有某种方法来获取每个项目的索引。这些索引不仅仅来自哈希函数;还来自哈希函数。他们需要满足这样的性质:如果任何对象x出现在任何对象y之前,则x的桶索引必须不大于y的桶索引。许多对象都具有此属性 - 您可以通过查看数字的某些位来对整数进行排序,并且可以通过查看前几个字符来对字符串进行排序 - 但许多对象不这样做。

桶排序的优点是,一旦将元素分配到桶中,每个桶就可以独立于其他桶进行处理。这意味着您通常需要对比原始数组小得多的数组进行排序作为后续步骤。这也意味着您可以对所有存储桶进行并行排序。缺点是,如果你的桶分配不好,你最终可能会做大量的额外工作而没有任何好处或 yield 很小。因此,当数据或多或少均匀分布时,或者存在基于输入数组的一组快速启发式智能方法来选择存储桶时,存储桶排序效果最佳。如果您有很大程度的可用并行性,桶排序也能很好地工作。

桶排序的另一个优点是您可以将其用作外部排序算法。如果您需要对一个太大而无法放入内存的列表进行排序,您可以通过 RAM 流式传输该列表,将项目分配到存储在外部文件中的存储桶中,然后对 RAM 中的每个文件进行独立排序。

以下是桶排序的一些缺点:

  • 如上所述,您无法将其应用于所有数据类型,因为您需要一个良好的存储方案。
  • 桶排序的效率对输入值的分布很敏感,因此如果您的值紧密聚集,则不值得。
  • 在许多可以使用桶排序的情况下,您也可以使用其他专门的排序算法(例如基数排序、计数排序或突发排序)来代替,以获得更好的性能。
  • 桶排序的性能取决于所选桶的数量,与其他算法相比,这可能需要一些额外的性能调整。

我希望这有助于您了解桶排序的相对优点和缺点。最终,确定它是否合适的最佳方法是将其与其他算法进行比较,看看它的实际效果如何,尽管上述标准可能会帮助您避免在不太可能正常工作的情况下花费时间进行比较。

关于sorting - 我什么时候应该选择桶排序而不是其他排序算法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31633391/

相关文章:

javascript - 使用 d3.layout.stack() 并为条形图解析 csv

python - 根据另一个列表的值顺序对字典列表进行排序

sorting - elasticsearch 聚合对存储桶键进行排序

java - 解释这个简单的程序 - 桶排序

c# - 基于子串匹配长度的高效 SQL 桶排序

algorithm - 美国国旗排序优化

javascript - 为什么这个 JavaScript 函数被调用两次?

javascript - 使用sort按偏好排序?

java - 使用求和和排序进行 mongodb 查询的最佳方法是什么

algorithm - 对 [0,2k] 之间的一系列 n 个数字进行排序,每对之间存在 : |Ai-Aj|>=k/n