Меня интересует сортировка массива положительных целочисленных значений за линейное время (в модели оперативной памяти с одинаковой мерой стоимости, т. Е. Целые числа могут иметь размер до логарифмического, но предполагается, что арифметические операции над ними будут выполняться единица времени). Конечно, это невозможно с помощью алгоритмов сортировки, основанных на сравнении, поэтому мне интересно вычислить «приблизительную» сортировку, то есть вычислить некоторую перестановку из , который на самом деле не сортируется в целом , а «хорошее приближение» из отсортированной версии . Я буду предполагать, что мы сортируем целые числа в порядке убывания, потому что это делает продолжение более приятным, но, конечно, можно сформулировать проблему наоборот.
Одним из возможных критериев приближенной сортировки является следующее (*): если будет , то для каждого мы требуем, чтобы (т.е. «квази-отсортированный» список сверху ограничен убывающей функцией ). Легко видеть, что фактическая сортировка удовлетворяет этому: должно быть больше, чем поэтому оно не больше есть , и в общем случае должно превышать который является,
Например, требование (*) может быть достигнуто с помощью алгоритма ниже (предложено @Louis). Мой вопрос: существует ли работа по этой задаче «почти сортировки» целых чисел в линейном времени, навязывая какое-то требование типа (*), которое бы удовлетворяла реальная сортировка? Имеет ли приведенный ниже алгоритм или какой-либо его вариант установленное имя?
Редактировать: исправлен алгоритм и добавлено больше объяснений
Алгоритм:
INPUT: V an array of size n containing positive integers
OUTPUT: T
N = Σ_{i<n} V[i]
Create n buckets indexed by 1..n
For i in 1..n
| Add V[i] into the bucket min(floor(N/V[i]),n)
+
For bucket 1 to bucket n
| For each element in the bucket
| | Append element to T
| +
+
Этот алгоритм работает как задумано по следующим причинам:
- Если элемент находится в сегменте то .
- Если элемент находится в сегменте то либо либо .
помещается в ведро , таким образом или . В первом случае что означает и, следовательно, .
Для в сегментах от 1 до j имеется не более элементов .
Пусть и - общее количество элементов в одном из сегментов 1..j. В силу 2. имеем, что каждый элемент в сегменте (с ) таков, что . Следовательно, сумма всех элементов в сегментах от до больше, чем . Но эта сумма также меньше поэтому и, следовательно, что дает нам или .
удовлетворяет (*), т.Е. элемент таков, что
Согласно 3. мы имеем, что , элемент , происходит из сегмента с поэтому .
Этот алгоритм занимает линейное время.
Вычисление занимает линейное время. Контейнеры могут быть реализованы с помощью связанного списка, который содержит вставку и итерацию . Вложенный цикл выполняется столько раз, сколько существует элементов (т.е. раз).