首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >何时使用合并排序,何时使用快速排序?

何时使用合并排序,何时使用快速排序?
EN

Stack Overflow用户
提问于 2011-10-25 00:27:33
回答 6查看 18.8K关注 0票数 18

wikipedia article for merge sort

wikipedia article for quick sort

这两篇文章都有出色的可视化效果。

两者都具有n*log(n)复杂度。

所以很明显,数据的分布会影响排序的速度。我的猜测是,由于比较可以快速地比较任何两个值,无论它们的分布如何,数据值的范围都无关紧要。

更重要的是,应该考虑相对于排序(去除幅度)的横向分布(x方向)。

一个不错的测试用例是如果测试数据具有某种级别的排序...

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-10-25 00:32:25

Java6和更早的版本使用合并排序作为排序算法,而C#使用QuickSort作为排序算法。

QuickSort比合并排序性能更好,即使它们都是O(nlogn)。快速排序的常量比合并排序的常量小。

票数 5
EN

Stack Overflow用户

发布于 2011-10-25 00:41:08

它通常取决于所涉及的数据结构。快速排序通常是最快的,但它不能保证O(n*log(n));在一些退化的情况下,它变成O(n^2)。堆排序是通常的替代方案;无论初始顺序如何,它都保证O(n*log(n)),但它具有更高的常量因子。它通常在你需要一个时间的硬性上限时使用。一些较新的算法使用快速排序,但尝试识别它何时开始退化,然后切换到堆排序。合并排序在数据结构不支持随机访问时使用,因为它适用于纯顺序访问(前向迭代器,而不是随机访问迭代器)。例如,它在std::list<>::sort中使用。它还广泛用于外部排序,与顺序访问相比,随机访问可能非常非常昂贵。(在对不适合内存的文件进行排序时,您可以将其拆分成适合内存的块,使用快速排序对这些块进行排序,将每个文件写出到一个文件中,然后对生成的文件进行合并排序。)

票数 16
EN

Stack Overflow用户

发布于 2012-06-09 04:30:37

Mergesort在处理链表时速度更快。这是因为在合并列表时指针可以很容易地改变。它只需要一次遍历列表(O(n))。

快速排序的就地算法需要数据的移动(交换)。虽然这对于内存中的数据集是非常有效的,但如果您的数据集不适合内存,那么它的成本可能会高得多。结果将是大量的I/O。

如今,出现了大量的并行化。并行化Mergesort比Quicksort (就地)简单。如果不使用就地算法,则快速排序的空间复杂度为O(n),这与合并排序相同。

因此,一般而言,快速排序对于适合内存的数据集可能更有效。对于较大的内容,最好使用mergesort。

使用合并排序而不是快速排序的另一个一般情况是,如果数据非常相似(也就是说,不是接近一致)。快速排序依赖于使用轴心。在所有值都相似的情况下,快速排序的最坏情况是O(n^2)。如果数据的值非常相似,那么很可能会选择一个糟糕的透视,从而导致非常不平衡的分区,从而导致O(n^2)运行时间。最直接的例子是列表中的所有值都是相同的。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7878768

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档