При оценке алгоритмов сортировки принято считать все сравнения между элементами массива как имеющие эквивалентную стоимость, игнорируя при этом сравнения между такими вещами, как индексы массива. Основная концепция c заключается в том, что для того, чтобы операции сортировки оставались отчетливо отличающимися от радикального разделения, размер сортируемых элементов должен был бы увеличиваться с увеличением их количества. Предположим, например, что у одного есть массив значений 1,000,000,000 char
, и он хочет отсортировать их. В то время как можно использовать быструю сортировку, пузырьковую сортировку или что-то еще, более быстрый подход будет состоять в том, чтобы просто использовать int[65536]
и подсчитать, сколько существует каждого значения. Даже если нужно отсортировать элементы с ключами char
, лучший способ сделать это - определить, куда поместить последний элемент с ключом 0 (количество элементов с ключом ноль, минус один), где разместить последний элемент с ключом 1 (количество элементов с ключами 0 или 1, минус один), et c. Все такие операции будут занимать время, пропорциональное количеству элементов плюс количество возможных значений ключа, без какого-либо фактора lg (N).
Обратите внимание, что если игнорировать затраты на «бухгалтерию», такие алгоритмы, как Quicksort, не являются вполне оптимально. Алгоритм сортировки, предназначенный для максимизации объема информации, получаемой при каждом сравнении, может выполнять несколько меньших сравнений. Однако, если сравнение не очень дорогое, такой алгоритм сортировки, скорее всего, будет тратить больше времени на то, чтобы быть «умным», чем на «глупость».
Одна проблема, которую я не видел, обсуждалась много, хотя я бы Я думаю, что это может принести значительную пользу во многих реальных случаях, будет оптимизировать последовательности сравнений между предметами, которые, как известно, находятся в узком диапазоне. Если при выполнении быстрой сортировки для серии имен путей из тысячи символов обрабатывается раздел, все записи которого известны между двумя именами, которые разделяют первые 950 символов, нет необходимости проверять первые 950 символов любых имен в этом разделе. Такая оптимизация вряд ли будет иметь смысл в терминах big-O, если только длина ключа не является параметром, но в реальном мире я ожидаю, что она иногда может оказывать влияние на порядок.