【发布时间】:2015-05-26 22:14:12
【问题描述】:
在很多情况下,快速排序比归并排序要好得多。不过,在什么情况下合并排序可能比快速排序更好?
例如,当数据不能一次加载到内存时,合并排序比快速排序更有效。还有其他情况吗?
编辑: 建议的重复问题的答案列出了快速排序相对于合并排序的所有优点。我在这里询问使用合并排序比使用快速排序更有利的可能案例和应用程序。
【问题讨论】:
标签: algorithm sorting quicksort mergesort
在很多情况下,快速排序比归并排序要好得多。不过,在什么情况下合并排序可能比快速排序更好?
例如,当数据不能一次加载到内存时,合并排序比快速排序更有效。还有其他情况吗?
编辑: 建议的重复问题的答案列出了快速排序相对于合并排序的所有优点。我在这里询问使用合并排序比使用快速排序更有利的可能案例和应用程序。
【问题讨论】:
标签: algorithm sorting quicksort mergesort
我可能应该首先提到,如果您不能一次将所有内容都放入内存,那么快速排序和合并排序都可以正常工作。您可以通过选择一个枢轴来实现快速排序,然后将元素从磁盘流式传输到内存中,并根据该元素与枢轴的比较情况将元素写入两个不同文件之一。如果您使用双端优先级队列,您实际上可以通过一次将最大数量的可能元素放入内存来更有效地做到这一点。
其他人提到归并排序是最坏情况 O(n log n) 的好处,这绝对是正确的。也就是说,您可以轻松地修改快速排序以生成 introsort 算法,这是快速排序、插入排序和堆排序之间的混合体,这是最坏情况的 O(n log n),但在大多数情况下仍保持快速排序的速度。
了解为什么快速排序通常比合并排序更快可能会有所帮助,因为如果您了解原因,您可以很快找到合并排序明显胜出的某些情况。快速排序通常比归并排序更好,原因有两个:
快速排序比归并排序具有更好的引用局部性,这意味着在快速排序中执行的访问通常比归并排序中的相应访问更快。
快速排序使用最坏情况的 O(log n) 内存(如果实现正确),而由于合并的开销,合并排序需要 O(n) 内存。
不过,在一种情况下,这些优势会消失。假设您要对元素的链表进行排序。链表元素分散在整个内存中,因此优势(1)消失了(没有引用的局部性)。其次,链表可以仅用 O(1) 空间开销而不是 O(n) 空间开销进行合并,因此优势 (2) 消失了。因此,您通常会发现归并排序是一种用于对链表进行排序的出色算法,因为它进行的总比较次数更少,并且不易受到糟糕的枢轴选择的影响。
希望这会有所帮助!
【讨论】:
【讨论】:
与快速排序相比,归并排序的一个最重要的优势是它的稳定性:比较相等的元素保留其原始顺序。
【讨论】:
快速排序是平均情况 O(n log n),但最坏情况是 O(n^2)。合并排序总是 O(n log n)。除了渐近最坏情况和归并排序的内存加载,我想不出其他原因。
快速排序比归并排序更差的场景:
如果您对数据一无所知,请使用合并排序而不是快速排序。
【讨论】:
归并排序的上限保证为 O(N log2N)。快速排序也有这样的限制,但要高得多 - 它是 O(N2)。当您需要保证代码时序的上限时,请使用合并排序而不是快速排序。
例如,如果您为依赖排序的实时系统编写代码,则归并排序将是更好的选择。
【讨论】:
【讨论】: