Все темы
39

Сортировка целых чисел их подсчётом

Tier 1Закрыто

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

1. Задача

Все сортировки, которые ты видел до сих пор, сравнивают пары. Они спрашивают, больше ли одно число другого, и по ответу решают: поменять местами или идти дальше. Любая сортировка сравнением построена на этом вопросе, и именно из-за него она не может работать быстрее, чем примерно за n log n.

Теперь другая ситуация. Чисел много, но все они целые и из небольшого диапазона. Возраст от 0 до примерно 120. Оценка в звёздах от 1 до 5. Баллы за тест от 0 до 100. Когда значения лежат в таком узком диапазоне, сортировать можно вообще без сравнений.

У тебя 100 000 ответов на опрос, и в каждом оценка от 1 до 5 звёзд. Ты хочешь упорядочить ответы от 1 звезды до 5. Сравнивать ответы между собой незачем: различных значений всего 5.

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

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

Завести бесплатный аккаунтПосмотреть, что входит
Сортировка подсчётом: посчитать ключи и выписать их
countingSort([3, 1, 4, 1, 0, 3, 2], 4)
arr
3
1
4
1
0
3
2
counts (индекс = ключ, ячейка = сколько раз)
0
0
0
0
0
out
пусто

Все ключи лежат от 0 до 4, поэтому заводим 5 счётчиков, по одному на каждый возможный ключ.

Гонка скорости
Сортировка подсчётом и слиянием на одних и тех же 40 числах от 1 до 8

Одна операция: одно сравнение, одно чтение или одна запись. За каждый кадр все дорожки делают одинаковое число операций, поэтому медленная отстаёт.

Сортировка подсчётом O(n + k)
операций: 0
Сортировка слиянием O(n log n)
операций: 0

 

А если чисел больше

Операции для n чисел и примерное время при 100 миллионах простых операций в секунду. Это оценка по тому же счёту, а не замер.

n = 1 000
Сортировка подсчётом2 тыс. · меньше 1 мс
Сортировка слиянием19,9 тыс. · меньше 1 мс
n = 100 000
Сортировка подсчётом200 тыс. · 2 мс
Сортировка слиянием3,3 млн · 33 мс
n = 10 000 000
Сортировка подсчётом20 млн · 200 мс
Сортировка слиянием465,1 млн · 4,7 с

Как узнать

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

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

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

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

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

На LeetCode

Задачи с целыми значениями из маленького диапазона, например рост до 100 или число цитирований, ограниченное n. Посчитай каждое значение и выпиши значения по порядку, ничего не сравнивая.

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