Все темы
40

Сортировка чисел по одной цифре за раз

Tier 1Закрыто

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

1. Задача

Сортировка подсчётом из прошлого урока работает быстро, но у неё есть слабое место. Она заводит по счётчику на каждое возможное значение, от 0 до самого большого числа. Для чисел до 9 это 10 ячеек, и всё хорошо. Для номеров (id) до миллиарда это миллиард ячеек. Столько памяти у программы обычно нет.

При этом цифр у таких номеров мало. У числа до миллиарда не больше 10 цифр. Отсюда вопрос: можно ли сортировать, глядя каждый раз на одну цифру, а не на всё число сразу?

У тебя 200 000 номеров заказов, каждый не больше 9 999 999. Их нужно отсортировать, и быстро. Массив из десяти миллионов счётчиков заводить не хочется.

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

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

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

Как узнать

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

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

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

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

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

На LeetCode

Задачи, где большие целые числа или строки цифр одной длины нужно отсортировать за линейное время, а полная таблица счётчиков слишком велика. Сортируй по одной цифре за проход и сохраняй порядок равных.

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