合并排序优先于快速排序?

时间:2015-03-23 19:09:30

标签: algorithm sorting quicksort mergesort

在许多情况下,快速排序比合并排序要好得多。但是,何时合并排序可能比快速排序更好?

例如,当数据无法一次加载到内存时,合并排序比快速排序更有效。还有其他案例吗?

编辑: 建议的重复问题列表的答案列出快速排序合并排序的所有优点。我在这里询问使用合并排序的可能情况和应用程序比使用快速排序更有利。

6 个答案:

答案 0 :(得分:36)

我应该首先提一下,如果你不能同时将所有内容都安装到内存中,那么quicksort和mergesort都可以正常工作。您可以通过选择一个数据透视表来实现快速排序,然后将元素从磁盘流入内存,并根据该元素与数据透视表的比较将元素写入两个不同文件中的一个。如果使用双端优先级队列,实际上可以通过一次将最大数量的可能元素拟合到内存中来更有效地执行此操作。

其他人已经提到mergesort是最坏情况O(n log n)的好处,这绝对是正确的。也就是说,您可以轻松地修改快速排序以生成introsort算法,即快速排序,插入排序和堆栈之间的混合,这是最坏情况下的O(n log n),但保留了快速排序的速度。大多数情况。

了解为什么quicksort通常比mergesort更快可能会有所帮助,因为如果您了解原因,您可以很快找到mergesort明显胜出的情况。 Quicksort通常比mergesort更好,原因有两个:

  1. Quicksort比mergesort具有更好的引用位置,这意味着在quicksort中执行的访问通常比mergesort中的相应访问更快。

  2. Quicksort使用最坏情况的O(log n)内存(如果正确实现),而mergesort需要O(n)内存,因为合并的开销。

  3. 但是,有一种情况,这些优势消失了。假设您要对元素的链接列表进行排序。链表元素分散在整个内存中,因此优势(1)消失(没有引用的位置)。其次,链接列表只能与O(1)空间开销合并而不是O(n)空间开销,因此优势(2)消失。因此,您通常会发现mergesort是一种用于对链表进行排序的优秀算法,因为它可以减少总比较次数,并且不会受到不良枢轴选择的影响。

    希望这有帮助!

答案 1 :(得分:9)

  1. MergeSort在设计上是稳定的,相同的元素保持其原始顺序。
  2. MergeSort非常适合并行(多线程)实现。
  3. MergeSort使用(约30%)比QuickSort更少的比较。这是一个经常被忽视的优势,因为比较可能非常昂贵(例如,在比较数据库行的几个字段时)。

答案 2 :(得分:8)

合并排序优于快速排序的一个最重要的优势是它的稳定性:比较的元素保持其原始顺序。

答案 3 :(得分:5)

Quicksort是平均情况O(n log n),但最坏情况是O(n ^ 2)。 Mergesort 始终 O(n log n)。除了渐近最坏的情况和mergesort的内存加载之外,我无法想到另一个原因。

当quicksort比mergesort更糟糕的场景时:

  1. 数组已经排序。
  2. 数组中的所有元素都相同。
  3. 数组按相反顺序排序。
  4. 如果您对数据一无所知,可以使用mergesort而不是快速排序。

答案 4 :(得分:3)

合并排序的保证上限为O(N log 2 N)。快速排序也有这样的限制,但它要高得多 - 它是O(N 2 )。当您需要保证代码时间的上限时,请使用合并排序而不是快速排序。

例如,如果您为依赖于排序的实时系统编写代码,则合并排序将是更好的选择。

答案 5 :(得分:1)

  1. Merge Sort Worst案例复杂度为O(nlogn),而Quick Sort最坏情况为O(n ^ 2)。
  2. 合并排序是一种稳定的排序,这意味着数组中的相同元素相对于彼此保持其原始位置。