在许多情况下,快速排序比归并排序更好。但是,在什么情况下归并排序可能比快速排序更好呢?
例如,当所有数据无法一次性加载到内存中时,归并排序的效果更好。还有其他情况吗?
建议重复问题的答案列出了使用快速排序优于归并排序的优点。我正在询问可能的情况和应用程序,其中归并排序比快速排序更好。
快速排序比归并排序具有更好的引用局部性,这意味着在快速排序中执行的访问通常比归并排序中对应的访问更快。
如果实现正确,快速排序使用最坏情况下 O(log n) 的内存,而归并排序由于合并的开销需要 O(n) 的内存。
然而,有一种情况下这些优点会消失。假设您想要对元素的链表进行排序。链表元素分散在内存中,因此优势(1)消失了(没有引用局部性)。其次,可以仅使用 O(1) 的空间开销合并链接列表,而不是 O(n) 的空间开销,因此优势(2)消失了。因此,通常您会发现归并排序是对于链表排序的更优算法,因为它进行的总比较较少,并且不容易受到糟糕的主元选择的影响。
相比快速排序,归并排序最重要的优势在于它的稳定性:比较相等的元素保留其原始顺序。
归并排序的时间复杂度保证在O(N log2N)内。快速排序也有这样的限制,但它要高得多——是O(N2)。当您需要对代码的时间性能有保障时,请使用归并排序而不是快速排序。
例如,如果您为实时系统编写依赖于排序的代码,那么归并排序将是更好的选择。