【问题标题】:When to use sorts over another何时使用排序而不是另一个
【发布时间】:2011-08-12 16:18:39
【问题描述】:

在 Quicksort、MergeSort 和 Binary Insertion Sort 中,是否有过使用其中任何一种而不是另一种的情况?

我知道像快速排序这样的东西在几乎排序的列表上可能会出现问题(但我相信枢轴的随机分配可以消除最坏情况的时间),所以使用 MergeSort 可能会更好。 MergeSort 可能比 QuickSort 使用更多空间,我不完全确定,Merge 可能更适合 LinkedLists。

我猜二进制插入排序更适合较小的列表?如果是这样,是否有使用此阈值的阈值,还是仅留给解释的大小?比如,如果列表大小为 3,我们应该使用二进制插入排序而不是 Quick 还是 Merge?

【问题讨论】:

  • 元评论:有一些关于特定情况下的最佳算法的问题,但没有关于一般最佳算法的问题;这可能是一个很好的维基。元元评论:“排序”不再像一个词。
  • 同意。 “最佳”问题在很大程度上取决于您的情况。例如:en.wikipedia.org/wiki/Sorting_algorithms
  • 好的,谢谢,很抱歉这些愚蠢的问题。但是,说快速排序不是自适应的是什么意思?我已经检查了sorting-algorithms.com/quick-sort,我认为这个词解释得不够清楚。
  • 关于哪种排序算法最好的帖子有很多。几乎每个人都会告诉您,这主要取决于您要排序的数据 - 多少,什么类型,是否已经/部分/大部分已经排序等等。这个问题是无法回答的 - 这完全是主观的,任何提供答案的尝试都是猜测。投票结束。
  • 我想补充一点,快速排序和归并排序之间最重要的区别是稳定性。合并排序是稳定的,而快速排序则不是。如果稳定性对您的数据很重要 - 在很多情况下很重要! - 那么在许多情况下,合并排序是唯一可行的选择。有趣的是,有很多“什么是最好的算法”问题,但有几个问题没有指出这种差异。

标签: java sorting binary quicksort mergesort


【解决方案1】:

我假设这是在寻求有关如何在 Java 中对内容进行排序的实用建议。

我的建议是,通常最好使用Arrays.sort(...),并依靠标准实现的启发式方法来决定使用哪种排序算法。您只需要担心以下情况:

  • 您知道您将对庞大的数据集进行排序,
  • 您知道您的数据集适用于特殊的排序方法;例如计数排序,或
  • 分析告诉您,您使用标准排序方法是一个性能瓶颈。

(在我的回答中隐含的是,您了解所有关于不同排序算法的特征,正如任何优秀的数据结构教科书中所介绍的那样。IMO,每个程序员都应该知道这些东西。)

【讨论】:

    【解决方案2】:

    斯蒂芬斯的回答是正确的,但我想补充一点。如果您查看算法书籍,它们会涵盖每种排序方法的效率。有时,如果您知道您的数据会是什么样子,那么特定的排序算法将具有比其他算法更好的最佳情况。如果我错了,请纠正我,任何人。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-23
      • 1970-01-01
      • 1970-01-01
      • 2019-02-23
      • 1970-01-01
      • 1970-01-01
      • 2011-09-25
      相关资源
      最近更新 更多