Бесплатная бета: 30 дней полного доступа, без карты.Зарегистрироваться бесплатно

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

Полевой справочник

Сортировка без сравнений (подсчётом / поразрядная)

O(n)

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

Сигналы

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

Шаблон

function countingSort(arr, maxVal) {
    const counts = new Array(maxVal + 1).fill(0);
    for (const x of arr) counts[x]++;
    const out = [];
    for (let v = 0; v <= maxVal; v++) {
        while (counts[v]-- > 0) out.push(v);
    }
    return out;
}

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

  • Быстрая сортировка (merge/quick): Сортировки сравнениями в худшем случае никогда не обгонят O(n log n), это доказанная нижняя граница. Подсчёт/поразрядная обгоняют её только за счёт использования небольшого целочисленного диапазона ключей; без этой структуры остаётся merge/quick.

ключи - целые числа, ограниченные k, и k порядка O(n) или меньше -> O(n + k) время, O(n + k) память. Явно указанный малый/известный диапазон ключей (а не просто «n большое») - сигнал сюда, а не к обычной сортировке сравнениями.

Изучить этот паттерн