Я думаю, что люди путают Quicksort с алгоритмом сортировки на основе разделов и "qsort" для различных реализаций библиотеки.
Я предпочитаю рассматривать алгоритм быстрой сортировки как включающий алгоритм выбора сводной оси, что весьма важно при анализе его поведения.
Если первый элемент всегда выбирается в качестве основного, тогда уже отсортированный список является наихудшим. Часто существует высокая вероятность того, что массив уже / почти отсортирован, поэтому эта реализация довольно плохая.
Аналогично, выбор последнего элемента в качестве точки разворота плох по той же причине.
Некоторые реализации пытаются избежать этой проблемы, выбирая средний элемент в качестве стержня. Это не будет работать так плохо на уже / почти отсортированных массивах, но все же можно будет создать вход, который будет использовать этот предсказуемый выбор сводки и заставит его работать за квадратичное время.
Таким образом, вы получаете рандомизированные алгоритмы выбора разворота, но даже это не гарантирует O(N log N)
.
Таким образом, были разработаны другие алгоритмы, которые использовали бы некоторую информацию из последовательности перед выбором точки разворота. Конечно, вы можете отсканировать всю последовательность и найти медиану, и использовать ее как опорную точку. Это гарантирует O(N log N)
, но на практике, конечно, медленнее.
Таким образом, некоторые углы обрезаны, и люди разработали алгоритм медианы-3. Конечно, позже даже это могло быть использовано так называемым «убийцей медиан 3».
Поэтому делается больше попыток придумать более «интеллектуальные» алгоритмы выбора разворота, которые гарантируют O(N log N)
асимптотическое поведение, которое все еще достаточно быстрое, чтобы быть практичным, с различной степенью успеха.
Так что на самом деле, если не указать конкретную реализацию быстрой сортировки, вопрос о том, когда происходит наихудший сценарий, является плохо определенным. Если вы используете так называемый алгоритм выбора среднего значения медианы, квадратичного сценария наихудшего случая не существует.
Однако большинство реализаций библиотек, скорее всего, утратят O(N log N)
гарантию гораздо более быстрой сортировки в среднем случае. Некоторые из действительно старых реализаций используют первый элемент в качестве центра, который теперь хорошо понимается как плохой и более не практикуется.