什么时候合并排序优于快速排序?
When merge sort is preferred over Quick sort?
在很多情况下,快速排序比归并排序要好得多。但是,在什么情况下合并排序可能是比快速排序更好的解决方案?
例如,当数据无法立即加载到内存时,归并排序比快速排序效果更好。还有其他情况吗?
编辑:
建议的重复问题的答案列出了快速排序相对于合并排序的所有优点。我在这里询问使用合并排序比使用快速排序有利的可能情况和应用程序。
快速排序的平均情况为 O(n log n),但最坏情况为 O(n^2)。归并排序总是 O(n log n)。除了渐近最坏情况和合并排序的内存加载,我想不出还有什么原因。
快速排序比合并排序差的场景:
- 数组已经排序。
- 数组中的所有元素都相同。
- 数组倒序排列。
如果您对数据一无所知,请使用合并排序而不是快速排序。
归并排序的上限为 O(N log2N)。快速排序也有这样的限制,但它要高得多——它是 O(N2)。当您需要保证代码时序的上限时,请使用合并排序而不是快速排序。
例如,如果您为依赖排序的实时系统编写代码,合并排序将是更好的选择。
我可能应该首先提到如果您不能一次将所有内容都放入内存,那么快速排序和合并排序都可以正常工作。您可以通过选择一个枢轴来实现快速排序,然后将元素从磁盘流式传输到内存中,并根据元素与枢轴的比较将元素写入两个不同文件之一。如果您使用双端优先级队列,您实际上可以通过一次将最大数量的可能元素装入内存来更有效地执行此操作。
其他人提到了归并排序是最坏情况 O(n log n) 的好处,这绝对是真的。也就是说,您可以轻松修改快速排序以生成 introsort 算法,这是快速排序、插入排序和堆排序的混合体,这是最坏情况下的 O(n log n),但在大多数情况下保持快速排序的速度。
了解为什么快速排序通常比归并排序更快可能会有所帮助,因为如果您了解其中的原因,您可以很快找到归并排序明显胜出的某些情况。快速排序通常优于归并排序,原因有二:
快速排序比合并排序具有更好的引用局部性,这意味着快速排序中执行的访问通常比合并排序中的相应访问更快。
Quicksort 使用最坏情况 O(log n) 内存(如果正确实现),而归并排序由于合并开销需要 O(n) 内存。
不过,在一种情况下,这些优势会消失。假设您要对元素的链表进行排序。链表元素分散在整个内存中,因此优势 (1) 消失了(没有引用的位置)。其次,链表可以仅以 O(1) space 开销而不是 O(n) space 开销合并,因此优势 (2) 消失了。因此,您通常会发现 mergesort 是一种用于对链表进行排序的高级算法,因为它进行的总比较次数较少,并且不易受到糟糕的主元选择的影响。
希望对您有所帮助!
合并排序相对于快速排序的一个最重要的优点是它的稳定性:比较相等的元素保留其原始顺序。
- MergeSort 在设计上是稳定的,相等的元素保持原来的顺序。
- MergeSort 非常适合并行(多线程)实现。
- MergeSort 使用的比较比 QuickSort 少(大约 30%)。这是一个经常被忽视的优势,因为比较可能非常昂贵(例如,在比较数据库行的多个字段时)。
- 合并排序最坏情况复杂度为 O(nlogn) 而快速排序最坏情况为 O(n^2)。
- 归并排序是一种稳定的排序,这意味着数组中的相同元素彼此保持其原始位置。
在很多情况下,快速排序比归并排序要好得多。但是,在什么情况下合并排序可能是比快速排序更好的解决方案?
例如,当数据无法立即加载到内存时,归并排序比快速排序效果更好。还有其他情况吗?
编辑: 建议的重复问题的答案列出了快速排序相对于合并排序的所有优点。我在这里询问使用合并排序比使用快速排序有利的可能情况和应用程序。
快速排序的平均情况为 O(n log n),但最坏情况为 O(n^2)。归并排序总是 O(n log n)。除了渐近最坏情况和合并排序的内存加载,我想不出还有什么原因。
快速排序比合并排序差的场景:
- 数组已经排序。
- 数组中的所有元素都相同。
- 数组倒序排列。
如果您对数据一无所知,请使用合并排序而不是快速排序。
归并排序的上限为 O(N log2N)。快速排序也有这样的限制,但它要高得多——它是 O(N2)。当您需要保证代码时序的上限时,请使用合并排序而不是快速排序。
例如,如果您为依赖排序的实时系统编写代码,合并排序将是更好的选择。
我可能应该首先提到如果您不能一次将所有内容都放入内存,那么快速排序和合并排序都可以正常工作。您可以通过选择一个枢轴来实现快速排序,然后将元素从磁盘流式传输到内存中,并根据元素与枢轴的比较将元素写入两个不同文件之一。如果您使用双端优先级队列,您实际上可以通过一次将最大数量的可能元素装入内存来更有效地执行此操作。
其他人提到了归并排序是最坏情况 O(n log n) 的好处,这绝对是真的。也就是说,您可以轻松修改快速排序以生成 introsort 算法,这是快速排序、插入排序和堆排序的混合体,这是最坏情况下的 O(n log n),但在大多数情况下保持快速排序的速度。
了解为什么快速排序通常比归并排序更快可能会有所帮助,因为如果您了解其中的原因,您可以很快找到归并排序明显胜出的某些情况。快速排序通常优于归并排序,原因有二:
快速排序比合并排序具有更好的引用局部性,这意味着快速排序中执行的访问通常比合并排序中的相应访问更快。
Quicksort 使用最坏情况 O(log n) 内存(如果正确实现),而归并排序由于合并开销需要 O(n) 内存。
不过,在一种情况下,这些优势会消失。假设您要对元素的链表进行排序。链表元素分散在整个内存中,因此优势 (1) 消失了(没有引用的位置)。其次,链表可以仅以 O(1) space 开销而不是 O(n) space 开销合并,因此优势 (2) 消失了。因此,您通常会发现 mergesort 是一种用于对链表进行排序的高级算法,因为它进行的总比较次数较少,并且不易受到糟糕的主元选择的影响。
希望对您有所帮助!
合并排序相对于快速排序的一个最重要的优点是它的稳定性:比较相等的元素保留其原始顺序。
- MergeSort 在设计上是稳定的,相等的元素保持原来的顺序。
- MergeSort 非常适合并行(多线程)实现。
- MergeSort 使用的比较比 QuickSort 少(大约 30%)。这是一个经常被忽视的优势,因为比较可能非常昂贵(例如,在比较数据库行的多个字段时)。
- 合并排序最坏情况复杂度为 O(nlogn) 而快速排序最坏情况为 O(n^2)。
- 归并排序是一种稳定的排序,这意味着数组中的相同元素彼此保持其原始位置。