В худшем случае для простого Реализация Quicksort происходит, когда вход уже отсортирован для вашей стратегической стратегии, например, если вы выбираете опорный элемент в качестве первого элемента подматрицы, вы получите наихудшее время выполнения, если ваши элементы уже в порядке. Поскольку мы часто сортируем массивы, которые «в основном отсортированы», чтобы начать с рандомизации выбора стержня, вы можете значительно приблизиться к ожидаемому времени выполнения на практике.
В идеале вы хотите выбрать стержень, который равномерно разделил бы вспомогательные проблемы, есть несколько вариантов выбора, из которых выбор случайного элемента - это только один. Другая, другая стратегия, которую я видел, отображает массив, собирающий 5 элементов, а затем используя медиану. (Edit: С другой ответ он выглядит DualPivotQuicksort на самом деле этот стиль с 7 точек отбора проб с последующим делением на три раздела Там нет случайности в этом подходе, а отбор проб.).
В конце концов, это все о нахождение наиболее быстрого или наиболее эффективного варианта для конкретной задачи. Если у вас есть дополнительная информация о базовой структуре того, что вы сортируете, вы можете адаптировать вариацию алгоритма, чтобы быть более успешной на ваших наборах данных. В библиотеке вы хотите быть быстрым, но также предсказуемым перед лицом «неправильного использования». Вот почему подход, который имеет хорошую производительность на уже отсортированном массиве, подобном этому, является хорошим кандидатом.
Как бы этот метод собирания шарниров гарантировать, что мы получим ожидаемый O (п Л.Г. (п)). Это только эмпирическое или у нас есть некоторые теоретические доказательства? – mankadnandan
Нет, это только эмпирически. Нет доказательств, и нет гарантии O (n lg n). –
@LouisWasserman спасибо – mankadnandan