Мене цікавить сортування масиву позитивних цілих значень за лінійним часом (у моделі ОЗУ з рівномірною мірою витрат, тобто цілі числа можуть мати до логарифмічного розміру, але арифметичні операції на них, як передбачається, приймають одиниця часу). Звичайно, це неможливо з алгоритмами сортування на основі порівняння, тому мені цікаво обчислити "приблизний" сорт, тобто обчислити деяку перестановку з , який на самому ділі не сортується в цілому , а «добре наближення» з відсортованої версії . Я буду припускати, що ми сортуємо цілі числа у порядку зменшення, оскільки це робить продовження трохи приємніше констатувати, але, звичайно, можна було б вирішити проблему навпаки.
Одним із можливих критеріїв приблизного сортування є такий (*): нехай є , для кожного нам потрібно, щоб (тобто, список "квазісортизованих" обмежується зверху функцією зменшення ). Неважко помітити, що фактичний сорт задовольняє цьому: має бути не більшим, ніж тож воно є не більше що є , і взагалі має бути не більше що \ leq N / i.
Наприклад, вимога (*) може бути досягнута алгоритмом, наведеним нижче (запропонований @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
| +
+
Цей алгоритм працює за призначенням з наступних причин:
- Якщо елемент знаходиться у відрі то .
покладено у відро , таким чином
- Якщо елемент знаходиться у відрі то або або .
j = min ( N / v , n ) j = ⌊ N / v ⌋ j = n j = ⌊ N / v ⌋ j ≤ N / v < j + 1 N / ( j + 1 ) < v поміщається у відро , таким чином або . У першому випадку що означає і, таким чином, .
Для у відрах є, щонайбільше, елементів, від 1 до .
Нехай і - загальна кількість елементів в одному з відрів 1..j. За 2. маємо, що кожен елемент відра (при ) такий, що . Тому сума усіх елементів у відрах від до більша, ніж . Але ця сума також менша, ніж таким чином і, таким чином, що дає нам або .
задовольняє (*), тобто -й елемент такий, що
За 3. маємо, що , -й елемент , походить з відра з тому .
Цей алгоритм займає лінійний час.
Обчислення займає лінійний час. Відра можуть бути реалізовані за допомогою пов'язаного списку, який має введення та ітерацію . Вкладений цикл працює стільки разів, скільки є елементів (тобто разів).