В стандартном курсе алгоритмов нас учат, что быстрая сортировка в среднем составляет а в худшем случае . В то же время изучаются другие алгоритмы сортировки: в худшем случае (например, mergesort и heapsort ) и даже линейное время в лучшем случае (например, сортировка пузырьков ), но с некоторыми дополнительными потребностями в памяти.O ( п 2 ) О ( п войти п )
После быстрого взгляда на еще несколько времен выполнения, естественно сказать, что быстрая сортировка не должна быть такой же эффективной, как другие.
Кроме того, учтите, что на базовых курсах программирования студенты изучают, что рекурсия не очень хороша в целом, потому что она может использовать слишком много памяти и т. Д. Поэтому (и хотя это не реальный аргумент), это дает идею, что быстрая сортировка не может быть действительно хорошо, потому что это рекурсивный алгоритм.
Почему же тогда быстрая сортировка превосходит другие алгоритмы сортировки на практике? Связано ли это со структурой реальных данных ? Это связано с тем, как работает память в компьютерах? Я знаю, что некоторые воспоминания намного быстрее, чем другие, но я не знаю, является ли это реальной причиной этой нелогичной работы (по сравнению с теоретическими оценками).
Обновление 1: канонический ответ говорит, что константы, включенные в среднего случая, меньше, чем константы, включенные в другие алгоритмы . Тем не менее, мне еще предстоит увидеть правильное обоснование этого, с точными расчетами вместо интуитивных идей.O ( n log n )
В любом случае кажется, что реальная разница возникает, как предполагают некоторые ответы, на уровне памяти, где реализации используют преимущества внутренней структуры компьютеров, используя, например, кэш-память быстрее, чем ОЗУ. Обсуждение уже интересно, но я все же хотел бы получить более подробную информацию относительно управления памятью, так как кажется , что ответ должен делать с ней.
Обновление 2: есть несколько веб-страниц, предлагающих сравнение алгоритмов сортировки, некоторые из которых более привлекательны, чем другие (в первую очередь sorting-algorithms.com ). Помимо представления хорошего визуального пособия, этот подход не отвечает на мой вопрос.