Все темы
37

Сортировка разбиением вокруг опорного элемента

Tier 1Закрыто

Где применяется

1. Задача

Сортировка слиянием дала время O(n log n). Она режет список пополам вслепую. Основную работу она делает потом, когда сливает половины. К той же скорости ведёт и другой путь: основную работу можно сделать до деления.

Выбери один элемент и назови его опорным (по-английски pivot). Остальные раздели на две группы: числа меньше опорного и числа не меньше опорного. Теперь опорный стоит на своём окончательном месте: слева от него всё меньше, справа всё равно ему или больше. Двигать его больше не придётся.

В этом одном действии вся идея. Сделай его, а потом сделай то же самое с каждой группой.

Этот шаг из платной части

Бесплатные шаги в начале курса (их 33) открыты всем: урок, задача и тесты. Этот шаг открывается с полным доступом. Начни с бесплатного аккаунта и бесплатных шагов.

Завести бесплатный аккаунтПосмотреть, что входит

Как узнать

Быстрая сортировка (merge / quick) (Fast sort (merge / quick))

Эти слова в условии значат этот паттерн

  • сортировка массива реального размера (тысячи+)
  • нужна гарантированная или ожидаемая O(n log n)
  • сортировка как подготовительный шаг перед другим алгоритмом (два указателя, жадный, сканирующая прямая)
  • нужна стабильность (сортировка слиянием) или сортировка на месте (быстрая сортировка)
  • просто «отсортируй это» без намёка на малое n или особые ключи

Похоже, но не то

n до 1e6 даёт O(n log n). Merge требует O(n) дополнительной памяти, quick требует O(log n).

На LeetCode

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

Мы используем необходимые куки для работы сайта (вход и язык). Если ты согласишься, мы также загрузим Google Analytics, чтобы видеть, какие страницы читают, и Google reCAPTCHA для защиты форм обратной связи и сообщений об ошибке от спама. Политика конфиденциальности