В рамках домашнего задания, посвященного реализации интросорта, меня спрашивают, почему используется heapsort, а не mergesort (или другие алгоритмы в этом отношении).
Интросорт - это гибридный алгоритм сортировки, который обеспечивает как быструю среднюю производительность, так и (асимптотически) оптимальную производительность в худшем случае. Он начинается с быстрой сортировки и переключается на heapsort, когда глубина рекурсии превышает уровень, основанный на (логарифме) числа сортируемых элементов. ( Википедия , получено 2014-May-06.)
Единственная причина, по которой я могу придумать, заключается в том, что heapsort «на месте» ... Но я не очень понимаю, почему это здесь имеет значение.
algorithms
algorithm-analysis
sorting
user672009
источник
источник
Ответы:
2 недостатка быстрой сортировки в том, что она требует дополнительного пространства (для сохранения несортированных интервалов), и неправильный выбор пивота (или искусственные последовательности, предназначенные для выбора плохого пивота) может привести к тому, что он будет алгоритм времени и дополнительного пространства.O ( n 2 ) O ( n )O(logn) O(n2) O(n)
Переключение на heapsort, когда глубина рекурсии становится слишком большой (около ), означает, что у нас есть гарантированная верхняя граница, то есть времени и дополнительного пространства.O ( n log n ) O ( log n )logn O(nlogn) O(logn)
Пирамидальная сортировка в дополнительное требование пространства делает его лучшим выбором для mergsort в , где для надуманного массива, может быть еще большим.O ( n ) nO(1) O(n) n
Причина, по которой heapsort не используется для полной сортировки, заключается в том, что она медленнее, чем быстрая сортировка (частично из-за скрытых констант в большом выражении O и частично из-за поведения кэша)
источник