在许多情况下,快速排序比合并排序要好得多。但是,何时合并排序可能比快速排序更好?
例如,当数据无法一次加载到内存时,合并排序比快速排序更有效。还有其他案例吗?
编辑: 建议的重复问题列表的答案列出快速排序合并排序的所有优点。我在这里询问使用合并排序的可能情况和应用程序比使用快速排序更有利。
答案 0 :(得分:36)
我应该首先提一下,如果你不能同时将所有内容都安装到内存中,那么quicksort和mergesort都可以正常工作。您可以通过选择一个数据透视表来实现快速排序,然后将元素从磁盘流入内存,并根据该元素与数据透视表的比较将元素写入两个不同文件中的一个。如果使用双端优先级队列,实际上可以通过一次将最大数量的可能元素拟合到内存中来更有效地执行此操作。
其他人已经提到mergesort是最坏情况O(n log n)的好处,这绝对是正确的。也就是说,您可以轻松地修改快速排序以生成introsort算法,即快速排序,插入排序和堆栈之间的混合,这是最坏情况下的O(n log n),但保留了快速排序的速度。大多数情况。
了解为什么quicksort通常比mergesort更快可能会有所帮助,因为如果您了解原因,您可以很快找到mergesort明显胜出的情况。 Quicksort通常比mergesort更好,原因有两个:
Quicksort比mergesort具有更好的引用位置,这意味着在quicksort中执行的访问通常比mergesort中的相应访问更快。
Quicksort使用最坏情况的O(log n)内存(如果正确实现),而mergesort需要O(n)内存,因为合并的开销。
希望这有帮助!
答案 1 :(得分:9)
答案 2 :(得分:8)
合并排序优于快速排序的一个最重要的优势是它的稳定性:比较的元素保持其原始顺序。
答案 3 :(得分:5)
Quicksort是平均情况O(n log n),但最坏情况是O(n ^ 2)。 Mergesort 始终 O(n log n)。除了渐近最坏的情况和mergesort的内存加载之外,我无法想到另一个原因。
当quicksort比mergesort更糟糕的场景时:
如果您对数据一无所知,可以使用mergesort而不是快速排序。
答案 4 :(得分:3)
合并排序的保证上限为O(N log 2 N)。快速排序也有这样的限制,但它要高得多 - 它是O(N 2 )。当您需要保证代码时间的上限时,请使用合并排序而不是快速排序。
例如,如果您为依赖于排序的实时系统编写代码,则合并排序将是更好的选择。
答案 5 :(得分:1)