📜  为什么quicksort比mergesort好?

📅  最后修改于: 2021-04-29 04:46:26             🧑  作者: Mango

这是DS访谈中的一个常见问题,尽管快速排序在最坏的情况下表现更好,但快速排序被认为比合并排序更好。由于某些原因,最好使用快速排序,尤其是在数组的情况下:

  1. 辅助空间: Mergesort使用额外的空间,quicksort需要很少的空间,并具有良好的缓存位置。快速排序是一种就地排序算法。就地排序意味着无需额外的存储空间即可执行排序。合并排序需要一个临时数组来合并排序后的数组,因此它不是就地放置的,从而为快速排序提供了空间优势。
  2. 最坏的情况:使用随机快速排序可以避免快速排序O(n 2 )的最坏情况。通过选择正确的枢轴,可以很容易地避免这种情况。通过选择正确的枢轴元素来获得平均情况下的行为,使其即兴发挥性能并变得像合并排序一样高效。
  3. 引用的位置:特别是Quicksort表现出良好的缓存位置,这使其在许多情况下(例如在虚拟内存环境中)比合并排序要快。
  4. 合并排序更适合大型数据结构:与快速排序和堆排序不同,合并排序是一种稳定的排序,可以很容易地进行调整以对链接列表和存储在访问速度较慢的介质(例如磁盘存储或网络连接存储)中的超大列表进行操作。详情请参阅

排序图像

C++ STL中存在的std :: sort()函数是一种混合排序算法,提供O(nlogn)的平均和最坏情况下的时间复杂度。它使用的排序算法称为Introsort。

Introsort是quicksort和heapsort的组合,它以quicksort开头,如果递归深度超过基于要排序的元素数的级别,则切换到heapsort。

相关文章:为什么对数组优先使用“快速排序”,而对链表则首选“合并排序”?