Быстрый сортировка по объему

Почему быстрый сортировка может быть лучше, чем сортировка слияния?

Ответ 1

Смотрите Quicksort в wikipedia:

Как правило, quicksort значительно быстрее на практике, чем другие Θ (nlogn) алгоритмов, поскольку его внутренний цикл может быть эффективно реализованы на большинстве архитектуры, а в большинстве реальных данных, можно сделать дизайн выбор, который минимизирует вероятность требующего квадратичного времени.

Обратите внимание, что очень низкая потребность в памяти также является большим плюсом.

Ответ 2

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

Ответ 3

Для наихудшего случая сортировки сортировки O(n*log(n)), для быстрого сортировки: O(n 2). Для других случаев (avg, best) оба имеют O(n*log(n)). Однако Quick sort является пространственной константой, где сортировка Merge зависит от структуры, которую вы сортируете.

См. это сравнение.

Вы также можете увидеть его визуально.

Ответ 4

Я лично хотел проверить разницу между сортировкой Quick sort и merge и увидеть время работы для образца из 1 000 000 элементов.

Быстрая сортировка смогла сделать это за 156 миллисекунд, тогда как Сортировка слияния сделала то же самое за 247 миллисекунд

Однако данные быстрой сортировки были случайными и быстрыми, если данные случайны, если это не относится к сортировке слиянием, т.е. сортировка слияния выполняется независимо друг от друга при сортировке данных или нет. Но для сортировки слияния требуется одно полное дополнительное пространство, а быстрая сортировка не является его сортировкой по месту

Я написал полную рабочую программу для них, также будут иллюстрации.

Ответ 5

В то время как quicksort часто является лучшим выбором, чем сортировка слияния, есть определенные моменты, когда сортировка слияния является приемлемым выбором. Самое очевидное время, когда чрезвычайно важно, чтобы ваш алгоритм работал быстрее, чем O (n ^ 2). Quicksort обычно быстрее, чем это, но, учитывая теоретический наихудший возможный ввод, он может работать в O (n ^ 2), что хуже худшего возможного типа слияния.

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

Ответ 6

В дополнение к остальным: сортировка слияния очень эффективна для неизменяемых структур данных, таких как связанные списки, и поэтому является хорошим выбором для (чисто) функциональных языков программирования.

Плохо реализованная quicksort может быть угрозой безопасности.

Ответ 7

Quicksort на месте. Вам просто нужно поменять местами данные во время функции Partitioning. Для Mergesort требуется гораздо больше копирования данных. Вам нужно другое временное хранилище (обычно того же размера, что и исходный массив данных) для функции Merge.

Ответ 8

quicksort называется так по какой-либо причине,

основные моменты: оба являются устойчивыми типами (просто неудобство реализации), поэтому позволяет просто перейти к сложностям

его очень сбивает с толку только что овальные обозначения, пролитые и "злоупотребляемые", у них средняя сложность случая 0 (nlogn),

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

.. и поэтому мы рандомизировали quicksort, где мы произвольно выбираем шарнир и избегаем такого перекошенного разбиения, тем самым аннулируем весь сценарий n ^ 2 в любом случае даже для умеренно искаженного разбиения, такого как 3-4, у нас есть nlog (7/4) n, в идеале мы хотим 1-1 partion, таким образом, все 2 из O (nlog (2) n).

так что это O (nlogn), почти всегда и в отличие от сортировки слияния константы, скрытые под "большой-ой" нотацией, лучше для quicksort, чем для mergesort.. и он не использует лишнее пространство, как сортировка слияния.

но для быстрой сортировки quicksort требуется настройка, перефразировка, quicksort предоставляет вам возможности для настройки....

Ответ 9

Ответ будет слегка наклонен к quicksort w.r.t к изменениям, внесенным с помощью DualPivotQuickSort для примитивных значений. Он используется в JAVA 7 для сортировки в java.util.Arrays

It is proved that for the Dual-Pivot Quicksort the average number of
comparisons is 2*n*ln(n), the average number of swaps is 0.8*n*ln(n),
whereas classical Quicksort algorithm has 2*n*ln(n) and 1*n*ln(n)
respectively. Full mathematical proof see in attached proof.txt
and proof_add.txt files. Theoretical results are also confirmed
by experimental counting of the operations.

Здесь вы можете найти имплантацию JAVA7 - http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7-b147/java/util/Arrays.java

Дальше Удивительное чтение на DualPivotQuickSort - http://permalink.gmane.org/gmane.comp.java.openjdk.core-libs.devel/2628

Ответ 10

Неверно, что quicksort лучше. Кроме того, это зависит от того, что вы имеете в виду лучше, потребления памяти или скорости.

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

Вышеизложенное следует в терминах скорости.

Ответ 11

Quicksort на месте. Вам нужно очень мало дополнительной памяти. Это очень важно.

Хороший выбор медианы делает его еще более эффективным, но даже плохим выбором медианных гарантий Theta (nlogn).