什么时候应该选择铲斗排序而不是其他排序算法?

时间:2015-07-26 03:36:24

标签: sorting bucket-sort

什么时候铲斗排序算法是用于排序的最佳方法?是否有基于数据结构的大小,类型使用它们的推荐指南?

1 个答案:

答案 0 :(得分:14)

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

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

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

以下是铲斗分类的一些缺点:

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

我希望这有助于您了解铲斗分类的相对优势和劣势。最终,确定它是否合适的最佳方法是将其与其他算法进行比较,看看它实际上是如何做的,尽管上述标准可能会帮助您避免花费时间将其用于比较它的情况。不太可能运作良好。