Алгоритм радикального сортування в структурі даних

Що таке алгоритм сортування Radix?

Radix Sort — це непорівняльний алгоритм сортування. Він працює шляхом групування окремих цифр елементів, які потрібно відсортувати. Потім використовується стабільна техніка сортування, щоб упорядкувати елементи на основі їх основи. Це лінійний алгоритм сортування.

Процес сортування включає такі властивості:

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

Остання ітерація дасть нам повністю відсортований список.

Робота алгоритму сортування Radix

Робота алгоритму сортування Radix
Список цілих чисел для сортування

Давайте спробуємо відсортувати список цілих чисел на малюнку вище в порядку зростання за допомогою алгоритму Radix Sort.

Ось кроки для виконання процесу сортування за коренем:

Крок 1) Визначте елемент із максимальним значенням у списку. У цьому випадку це 835.

Крок 2) Обчислити кількість цифр максимального елемента. 835 має рівно 3 цифри.

Крок 3) Визначте кількість ітерацій на основі кроку 2. 835 має 3 цифри, тобто кількість ітерацій буде 3.

Крок 4) Визначте основу елементів. Оскільки це десяткова система, основою буде 10.

Крок 5) Почніть першу ітерацію.

а) Перша ітерація

Робота алгоритму сортування Radix
Сортування за останньою цифрою

У першій ітерації ми розглядаємо одиничне розрядне значення кожного елемента.

Крок 1) Змініть ціле число на 10, щоб отримати одиничне місце елементів. Наприклад, 623 mod 10 дає нам значення 3, а 248 mod 10 дає нам 8.

Крок 2) Використовуйте сортування підрахунком або будь-яке інше стабільне сортування, щоб упорядкувати цілі числа відповідно до їхніх молодших цифр. Як видно з малюнка, 248 припаде на 8 відро. 623 впаде на 3-е відро і так далі.

Після першої ітерації список тепер виглядає так.

Робота алгоритму сортування Radix
Список після першої ітерації

Як ви можете бачити з наведеного вище малюнка, список ще не відсортовано, і для його повного сортування потрібні додаткові ітерації.

б) Друга ітерація

Робота алгоритму сортування Radix
Сортування на основі розряду десятків

У цій ітерації ми розглянемо цифру в 10th місце для процесу сортування.

Крок 1) Розділіть цілі числа на 10. 248 поділити на 10 дає нам 24.

Крок 2) Змініть результат кроку 1 на 10. 24 mod 10 дає нам 4.

Крок 3) Виконайте крок 2 із попередньої ітерації.

Після другої ітерації список тепер виглядає так

Робота алгоритму сортування Radix
Список після другої ітерації

Ви можете побачити на наведеному вище малюнку, що список ще не відсортовано повністю, оскільки він ще не в порядку зростання.

в) Третя ітерація

Робота алгоритму сортування Radix
Сортування на основі цифр у сотнях місць

Для останньої ітерації ми хочемо отримати старшу цифру. У цьому випадку це 100th місце для кожного з цілих чисел у списку.

Крок 1) Розділіть цілі числа на 100… 415 поділити на 100 дає нам 4.

Крок 2) Змініть результат кроку 1 на 10. 4 mod 10 знову дає нам 4.

Крок 3) Виконайте крок 3 із попередньої ітерації.

Робота алгоритму сортування Radix
Список після третьої ітерації

Як ми бачимо, зараз список відсортовано за зростанням. Останню ітерацію завершено, і процес сортування завершено.

Псевдокод алгоритму сортування Radix

Ось псевдокод для алгоритму сортування Radix

radixSortAlgo(arr as an array)
  Find the largest element in arr
  maximum=the element in arr that is the largest
  Find the number of digits in maximum
  k=the number of digits in maximum 
  Create buckets of size 0-9 k times
for j -> 0 to k
  Acquire the jth place of each element in arr. Here j=0 represents the least significant digit.
  Use a stable sorting algorithm like counting sort to sort the elements in arr according to the digits of the elements in the jthplace
   arr = sorted elements

C++ Програма для впровадження Radix Sort

#include <iostream>
using namespace std;
// Function to get the largest element in an array
int getMaximum(int arr[], int n) {
  int maximum = arr[0];
  for (int i = 1; i < n; i++) {
    if (maximum < arr[i]) maximum = arr[i];
  }
  return maximum;
}
// We are using counting sort to sort the elements digit by digit
void countingSortAlgo(int arr[], int size, int position) {
  const int limit = 10;
  int result[size];
  int count[limit] = {0};
  // Calculating the count of each integers
  for (int j = 0; j < size; j++) count[(arr[j] / position) % 10]++;
  // Calculating the cumulative count
  for (int j = 1; j < limit; j++) {
    count[j] += count[j - 1];
  }
  // Sort the integers
  for (int j = size - 1; j >= 0; j--) {
    result[count[(arr[j] / position) % 10] - 1] = arr[j];
    count[(arr[j] / position) % 10]--;
  }
  for (int i = 0; i < size; i++) arr[i] = result[i];
}
// The radixSort algorithm
void radixSortAlgo(int arr[], int size) {
  // Get the largest element in the array
  int maximum = getMaximum(arr, size);
  for (int position = 1; maximum / position > 0; position *= 10)
    countingSortAlgo(arr, size, position);
}
// Printing final result
void printResult(int arr[], int size) {
  for (int i = 0; i < size; i++) {
    cout << arr[i] << " ";
  }
  cout << endl;
}
int main() {
  int arr[] = {162, 623, 835, 415, 248};
  int size = sizeof(arr) / sizeof(arr[0]);
  radixSortAlgo(arr, size);
  printResult(arr, size);
}

вихід:

162 248 415 623 835

Python Програма для алгоритму сортування Radix

#Radix Sort using python
def countingSortAlgo(arr, position):
    n = len(arr)
    result = [0] * n
    count = [0] * 10  # Calculating the count of elements in the array arr
    for j in range(0, n):
        element = arr[j] // position
        count[element % 10] += 1  # Calculating the cumulative count
    for j in range(1, 10):
        count[j] += count[j - 1]  # Sorting the elements
    i = n - 1
    while i >= 0:
        element = arr[i] // position
        result[count[element % 10] - 1] = arr[i]
        count[element % 10] -= 1
        i -= 1
    for j in range(0, n):
        arr[j] = result[j]


def radixSortAlgo(arr):  # Acquiring the largest element in the array
    maximum = max(arr)  # Using counting sort to sort digit by digit
    position = 1
    while maximum // position > 0:
        countingSortAlgo(arr, position)
        position *= 10


input = [162, 623, 835, 415, 248]
radixSortAlgo(input)
print(input)

вихід:

[162,248,415,623,835]

Аналіз складності Radix Sort

Є два типи складності, які слід враховувати, просторову складність і часову складність.

  • Просторова складність: O(n+b), де n — розмір масиву, а b — розглянута база.
  • Часова складність: O(d*(n+b)), де d – кількість цифр найбільшого елемента в масиві.

Просторова складність сортування за коренем

Дві функції, на які варто зосередитися для збільшення простору

  • Кількість елементів у масиві, n.
  • Основа для представлення елементів, b.

Іноді ця база може перевищувати розмір масиву.

Таким чином, загальна складність дорівнює O(n+b).

Наступні властивості елементів у списку можуть зробити простір радикального сортування неефективним:

  • Елементи з великою кількістю цифр.
  • База елементів велика, як 64-розрядні числа.

Часова складність сортування за принципом

Ви можете використовувати сортування підрахунку як підпрограму, оскільки кожна ітерація триватимеe O(n+b) час. Якщо існує d ітерацій, загальний час роботи стає O(d*(n+b)). Тут «O» означає функцію складності.

Лінійність Radix Sort

Radix Sort є лінійним, коли

  • d постійна, де d кількість цифр найбільшого елемента.
  • b не є значно більшим порівняно з n.

Порівняння Radix Sort з іншими порівняльними алгоритмами

Як ми бачили, складність сортування Radix базується на розмірі слова чи числа. Він матиме однакову складність для середнього та найкращого випадків. І це O(d*(n+b)). Крім того, він відрізняється залежно від техніки сортування, яку ви використовуєте в середині. Наприклад, ви можете використовувати сортування підрахунком або швидке сортування для проміжного алгоритму сортування всередині сортування Radix.

Застосування алгоритму сортування Radix

Важливими застосуваннями Radix Sort є:

  • Radix Sort можна використовувати як алгоритм пошуку розташування, де використовуються великі діапазони значень.
  • Він використовується для побудови суфіксного масиву в алгоритмі DC3.
  • Він використовується в послідовній машині з довільним доступом, наявній у типовому комп’ютері, де записи вводяться ключами.