Вступ до сортування графічних матеріалів

Сортування графінгу - це некомпетційно-сортувальний алгоритм, який виділяється при сортування цілих над невеликим, відомим діапазоном. На відміну від порівняння, таких як Quicksort або Mergesort, який спирається на порівняння паром, Сортування визначає сортове замовлення, підрахувавши частоту кожного відмінного значення. Такий підхід підвищує лінійну трудомісткість в умовах сприятливих умов, що робить його вибором для багатьох експлуатаційно-критичних додатків, де домен введення обмежений.

Алгоритм був першим описаний Harold H. Seward в 1954 році і залишається фундаментальною технікою в галузі комп'ютерної науки. Його простота і ефективність роблять його ідеальним для завдань, таких як сортування студентських віків, класів, або будь-яких цілих даних з скромним поширенням. За допомогою важільного додаткового зберігання пропорційно діапазону значення, Сортування дозволяє уникнути O(n log n) нижньої межі сортування, досягнення O(n + k) часу, де k є діапазоном вхідних значень.

Як розрахувати Сортування робіт

Основний механізм графування Сорту є прямимforward: він оцінює, скільки разів кожен значення з'являється в масиві введення, потім використовує, що підрахунок для обчислення кінцевого положення кожного елемента. Процес складається з трьох різних етапів:

  1. Коротування: Створення масиву кількості к ( діапазон значень вхідних даних), ініціалізованих до нуль.. Встановити через вхідний масив і підсилення кількості для кожного значення.
  2. Поповнення префіксів: Перетворення масиву кількість в масив суми префікса, де кожен елемент в індексі і тримає кумулятивний вміст елементів менше або дорівнює i. Цей крок визначає початкові позиції для кожного окремого значення в сортованому виході.
  3. Завантажувальні елементи: Перевернути масив вхідних даних з правого наліво (для стабільності), використовувати масив підрахунку для пошуку коректного індексу в масиві виведення, розмістити елемент там, а також відхилення кількості. Остаточний вихід являє собою сортовану копію введення.

Алгоритм повертає новий сортований масив, залишаючи вихідний. Варіант, який називається в місці Сортування графінгу, але рідко використовується, оскільки він порушує або стабільність або ефективність простору.

Приклад покрокового покрокового завдання

[4, 2, 8, 3, 1], де значення діапазону від 0 до 8.

  1. Короткий: Графічний масив розмір 9 (0–8) → [0,1,2,1,0,0,01]. (Індекс 1 з'являється один раз, індекс 2 двічі, індекс 3 двічі, індекс 4 раз, індекс 8 раз.)
  2. Prefix сума: Трансформація до кулратив → [0,1,3,5,6,6,6,7]. Тепер кожна вартість говорить нам стартову позицію для цього числа у сортованому виході.
  3. Output: Traverse оригінальний масив з кінця: перший елемент читання 1 → позиція = count[1] - 1 = 0 → вихід[0]=1, кількість дегрементів [1] до 0. Далі 3 → позиція = count (2009) - 1 = 4 → вихід[4]=3, count (2009)=4. Продовжити до всіх елементів, розміщених. Остаточний вихід: [1,2,2,3,3,4,8].

Цей приклад показує, як Сортування повністю не дозволяє повністю порівнювати, спираючись виключно на арифметичні операції.

Комплексність

Комплексність

  • Кращий, середній і найвпливовий чохол: O(n + k), де n є число елементів і k є діапазоном значень вхідних даних. Коли к невелика відносно n, алгоритм працює в лінійному режимі.
  • Компанія для порівняння сортів: Quicksort і Мергесорт мають O(n log n) середня складність. Для n = 106 і k = 1000, Сортування (≈ 1,001,000 операцій) становить близько 13 разів швидше, ніж типовий O(n log n) сорт.

Космічна комплексність

  • Primary: O(k) для масиву, плюс O(n) для масиву виведення. Ця покладна пам'яті може бути заборонена, якщо k є великим (наприклад, сортування 32-бітних цілих, де k = 232).
  • Стаблений варіант: Вимоги до допоміжного виходу масиву розмірів n; вмісні варіанти цитрусової стійкості або використання комплексної маніпуляції індексу.

Коли використовувати Сортування

Сортування за рахунками є найбільш ефективним в наступних умовах:

  • Введення складається з цілих цілих (або даних, які можна наклеювати на невеликий цілий діапазон, наприклад символів або дискретних категорій).
  • Діапазон к не значно більше n. Поширене правило великого пальця к ≤ O(n).
  • Пам'ять не сильно обмежена, тому що масив підрахунку і вихідний буфер вимагає додаткового простору.
  • Для зручності роботи необхідно (наприклад, сортування декількома ключами). Стандартна реалізація стабільна при розміщенні елементів праворуч до лівого.

Відмінні випадки використання включають сортування сорту (0–100), віки (0–120), категорії продуктів (до декількох сотень кодів), або як субротин в Radix Сорт.

Обмеження та роздуми

Незважаючи на свою швидкість, Сортування має недоліки, які обмежують його придатність:

  • Integer only: Він не може безпосередньо сортувати плаваючі номери або рядки, якщо вони перетворюються на контигузний ціле ціле.
  • Large діапазон: Якщо k карлики n—for example, сортування 100 чисел з значеннями між 1 і 107—з рахунком масиву споживає величезну пам'ять при сортування тільки декількох елементів.
  • Non‐adaptive: Сортування завжди вимагає сканування всього входу і побудови масиву підрахунку, навіть якщо дані вже сортовані або майже сортовані.
  • Негативні значення: Стандартний Сорт графінгу передбачає ненегативні цілі. Для обробки негативних значень можна змінити за допомогою відрахування мінімального (збільшення діапазону 0 до макс. – хв).

Ці обмеження – це спеціалізований інструмент, не універсальна заміна алгоритмів загального призначення.

Порівняння з суміжними Сортування алгоритмами

Сортування графів проти. Сорт Radix

Radix Сорт розширює ідею, сортуючи цифри від принаймні значних до найбільш значущих, використовуючи стабільний сорт (поширення Сортування) в кожному цифрі. Під час підрахунку Сорт працює над одним проходом над повним діапазоном k, Radix Сорт виконує кілька переходить над меншим діапазоном цифр (наприклад, бази 256), зменшення використання пам'яті для великого к. Наприклад, сортування 32-бітних цілих з Сортом графінгу вимагає кількості 232 записів, тоді як Radix Сортувати з 8-бітними цифрами вимагає 256 записів і тільки чотири переходи.

Сортування графів проти пряжки Сорт

Сорт ковша розподіляє елементи в ряд відро і сортує кожен відро індивідуально (попередньо з вставкою сорту). Сортування може бути виданий як особливий випадок сорту грека, де кожен відро відповідає одному відмінному значення. Сорт ковша добре працює на рівномірно розподілених float-point даних, але Сортування обмежений цілими доменами.

Реалізація стабільного сортування

Стентабельність є важливою при сортування одним ключем при збереженні відносного порядку рівних елементів з іншого ключа. Стандартний алгоритм сортування графінгу властиво стабільний при виході петлі розміщення переходить в вхід з правого наліво. Ось текстовий контур стабільного варіанту:

  1. Усунути масив кількість записів як описано.
  2. Перетворення в суми префіксу (позиції кожного значення в сортовому режимі).
  3. Встановіть масив введення в зворотному порядку. Для кожного елемента розташуйте його в положенні, зазначеному її підрахунку, потім розшифровку, що підраховують.

Ми обробляємо елементи з кінця, остання поява даної вартості переходить в найбільш оптимальний індекс, зберігаючи відносне замовлення. Ця стабільна версія є обов'язковою для Radix Сортувати, щоб правильно функціонувати на кожному цифрі.

Практичні програми

  • Повчання систем: Сортування сотні показників іспиту (range 0–100) в O(n) час.
  • Біоінформатика: Сортування цілих чисел чи частот ДНК k‐mer, коли розмір алфавіту невеликий (A, C, G, T).
  • Database index control: Сортування унікальних ідентифікаторів цілого діапазону досить мало, щоб відповідати пам'яті.
  • Обробка зображень: Сортування йоготограмних бункерів або кольорових інтенсивностей (0–255) при побудові стол.
  • Сортування вторинним ключем: Використовується всередині Radix Сорт, який є робочим органом для ефективного сортування в багатьох бібліотеках та мовах (наприклад, .NET runtime використовує адаптивну суміш алгоритмів, включаючи Сортування графінгу для малих діапазонів).

Для більш детальної інформації про теорію та варіанти, проконсультуйте довідкові довідки, такі як Вікіпедія: Сортування та GeeksforGeeks: Counting Сорт. Практичні порівняння з іншими алгоритмами можна знайти в Brilliant's Counting Сорт статті.

Оптимальний розрахунок Сорту для великих діапазонів

Коли к є великим, але n є також великим, чистий Сорт графінгу стає пам'ятним. Кілька оптимізації існують:

  • Compressed sparseness: Використовуйте хеш-карту замість контигузного масиву, коли діапазон використовуваних значень є великим, але кількість різних значень невелика. Ця торгівля постійно індексує для хешування накладних, але зменшує споживання пам'яті.
  • Hybrid підходи: Комбінований Сортування з іншими алгоритмами. Наприклад, якщо діапазон перевищує 106, використовуйте Radix Сорт з підставою, яка зберігає цифрові діапазони невеликими.
  • Упорядковані варіанти: Деякі оптимізації зменшують додатковий простір до O(k) без вихідних масивів, але вони зазвичай гідно стійкістю або вимагають циклів, щоб знайти позиції.

Висновок

Сортування графів виділяється як помітно ефективний алгоритм сортування цілих чисел, коли діапазон значення невеликий відносно кількості елементів. Його O(n + k) час складність і лінійна продуктивність роблять його незамінними в сценаріях, таких як сортування сортів, підроліни Radix Сорту, і додатки з обмеженими цілими ключами. Однак залежність алгоритму від цілого введення і його пам'яті накладені для великих діапазонів нагадує нам, що жоден сорт не оптимальний для всіх ситуацій. З розумінням при графстві Сорти розширюються - і коли він не виходить -розробники можуть будувати швидше, більш передбачувані системи. Для подальшого читання на некомпатрутифікованих за типом [Tint2[T: Count3[T: Count3[T: Count3[T: Count3[T: Count2[T: Count2Fintori[T:]