Все темы
38

Почему сортировки сравнением упираются в n log n

Tier 1Закрыто

1. Задача

Ты уже написал несколько сортировок. Пузырьковая, выбором и вставками работают за O(n2). Слиянием и быстрая работают за O(n log n), быстрая в среднем. Для целого семейства сортировок сортировка за O(n) на любом списке невозможна, и у этого есть точная причина. Все сортировки, которые ты видел, узнают о порядке одним способом. Они сравнивают два элемента, спрашивают «этот меньше?» и по ответу «да» или «нет» решают, что делать дальше. Других сведений о порядке у них нет. Этот урок показывает, почему такой способ ограничивает скорость, и вычисляет этот предел.

В продакшен этот код не пойдёт. Он нужен, чтобы понять, когда пора перестать ускорять сортировку сравнением и взять сортировку другого рода.

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

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

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

Как узнать

Сортировка без сравнений (подсчётом / поразрядная) (Non-comparison sort (counting / radix))

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

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

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

n значений с ключами меньше k дают O(n + k). Поразрядная стоит O(d умножить на n) при d разрядах.

На LeetCode

Ни одна задача на LeetCode не просит доказать эту границу. Она подсказывает, когда хватит искать сортировку сравнением побыстрее, и если задача требует O(n) на числах, как Maximum Gap, нужна сортировка подсчётом или поразрядная из уроков 39 и 40.

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