Когда сортировка слияния предпочтительнее быстрой сортировки?

быстрая сортировка во многих случаях намного лучше, чем сортировка слиянием. Хотя, когда случаи, когда сортировка слиянием может быть лучшим решением, чем быстрая сортировка?

, сортировка слиянием работает лучше, чем быстрая сортировка, когда данные не могут быть загружены в память сразу. Есть ли другие случаи?

изменить: Ответы на предложенный дубликат вопроса перечисляют все преимущества быстрой сортировки по сравнению с сортировкой слиянием. Я спрашиваю здесь о возможных случаях и приложениях, которые используют сортировку слиянием in было бы выгодно, чем использовать быструю сортировку.

6 ответов


Я, вероятно, должен начать с упоминания о том, что quicksort и mergesort могут работать отлично, если вы не можете поместить все в память сразу. Вы можете реализовать quicksort, выбрав pivot, затем потоковую передачу элементов с диска в память и запись элементов в один из двух разных файлов на основе того, как этот элемент сравнивается с pivot. Если вы используете очередь с двойным приоритетом, вы можете сделать это еще более эффективно, поместив максимальное количество возможных элементов в память сразу.

другие упоминали о преимуществе, которое mergesort является наихудшим случаем O (N log n), что определенно верно. Тем не менее, вы можете легко изменить quicksort для получения introsort алгоритм, гибрид между quicksort, сортировкой вставки и heapsort, который в худшем случае O(N log n), но в большинстве случаев сохраняет скорость quicksort.

было бы полезно узнать, почему quicksort обычно быстрее, чем mergesort, так как если вы понимаете причины, по которым вы может довольно быстро найти случаи, когда mergesort является явным победителем. Quicksort обычно лучше, чем mergesort по двум причинам:

  1. Quicksort имеет лучшую локальность ссылки, чем mergesort, что означает, что обращения, выполняемые в quicksort, обычно быстрее, чем соответствующие обращения в mergesort.

  2. Quicksort использует память наихудшего случая O (log n) (если реализовано правильно), в то время как mergesort требует памяти O(n) из-за издержки слияния.

есть один сценарий, хотя, где эти преимущества исчезают. Предположим, вы хотите отсортировать связанный список элементов. Связанные элементы списка разбросаны по всей памяти, поэтому преимущество (1) исчезает (нет расположения ссылок). Во-вторых, связанные списки могут быть объединены только с пространственными накладными расходами O(1) вместо o(n), поэтому преимущество (2) исчезает. Следовательно, вы обычно обнаружите, что mergesort является превосходным алгоритмом для сортировка связанных списков, поскольку она делает меньше общих сравнений и не подвержена плохому выбору оси.

надеюсь, что это помогает!


  1. MergeSort стабилизировано конструкцией, равные элементы держат их первоначально заказ.
  2. MergeSort хорошо подходит для параллельной реализации (многопоточности).
  3. MergeSort использует (около 30%) меньше сравнений, чем QuickSort. Это часто упускаемое преимущество, потому что сравнение может быть довольно дорогим (например, при сравнении нескольких полей строк базы данных).

самым важным преимуществом сортировки слиянием над быстрой сортировкой является ее стабильность:сравниваемые элементы сохраняют свой первоначальный порядок.


сортировка слиянием имеет гарантированный верхний предел O (N log2N). У быстрой сортировки тоже есть такой предел, но он намного выше-это O (n2). Когда вам нужна гарантированная верхняя граница времени вашего кода, используйте сортировку слиянием по быстрой сортировке.

например, если вы пишете код для системы реального времени, которая опирается на сортировка, сортировка слиянием будет лучшим выбором.


Quicksort-средний случай O(N log n), но имеет худший случай O (n^2). Сортировка слиянием является всегда O (N log n). Кроме асимптотического наихудшего случая и загрузки памяти mergesort, я не могу придумать другой причины.

сценарии, когда quicksort хуже, чем mergesort:

  1. массив уже отсортирован.
  2. все элементы в массиве одинаковы.
  3. массив сортируется в обратном порядке.

возьмите mergesort над quicksort, если вы ничего не знаете о данных.


  1. наихудшая сложность сортировки слияния-O(nlogn), тогда как худший случай быстрой сортировки-O (n^2).
  2. Merge Sort-это стабильная сортировка, которая означает, что один и тот же элемент массива сохраняет свои исходные позиции относительно друг друга.