Radix-sorteringsalgoritme i datastruktur

Hvad er Radix Sort Algorithm?

Radix Sort er en ikke-komparativ sorteringsalgoritme. Det fungerer ved at gruppere de individuelle cifre i de elementer, der skal sorteres. En stabil sorteringsteknik bruges derefter til at organisere elementerne ud fra deres radix. Det er en lineær sorteringsalgoritme.

Sorteringsprocessen involverer følgende egenskaber:

  • At finde det maksimale element og indhente antallet af cifre i det element. Det giver os antallet af iterationer, sorteringsprocessen vil følge.
  • Gruppér de individuelle cifre i elementerne på den samme signifikante position i hver iteration.
  • Grupperingsprocessen starter fra det mindst signifikante ciffer og slutter ved det mest signifikante ciffer.
  • Sortering af elementerne baseret på cifre på den signifikante position.
  • Opretholdelse af den relative rækkefølge af elementer, der har samme nøgleværdi. Denne egenskab af radix-sorten gør det til en stabil sort.

Den endelige iteration vil give os en fuldstændig sorteret liste.

Arbejde med Radix Sort Algorithm

Arbejde med Radix Sort Algorithm
Liste over heltal, der skal sorteres

Lad os prøve at sortere listen over heltal i ovenstående figur i stigende rækkefølge ved hjælp af Radix Sort-algoritmen.

Her er trinene til at udføre Radix-sorteringsprocessen:

Trin 1) Identificer elementet med den maksimale værdi på listen. I dette tilfælde er det 835.

Trin 2) Beregn antallet af cifre i det maksimale element. 835 har 3 cifre nøjagtigt.

Trin 3) Bestem antallet af iterationer baseret på trin 2. 835 har 3 cifre, hvilket betyder, at antallet af iterationer vil være 3.

Trin 4) Bestem grunden af ​​elementerne. Da dette er et decimalsystem, vil grundtallet være 10.

Trin 5) Start den første iteration.

a) Første iteration

Arbejde med Radix Sort Algorithm
Sortering efter sidste ciffer

I den første iteration betragter vi enhedspladsværdien for hvert element.

Trin 1) Ændr hele tallet med 10 for at få enhedspladsen for elementerne. For eksempel giver 623 mod 10 os værdien 3, og 248 mod 10 giver os 8.

Trin 2) Brug tællesortering eller en hvilken som helst anden stabil sortering til at organisere de heltal i overensstemmelse med deres mindst signifikante ciffer. Som det ses af figuren vil 248 falde på den 8. spand. 623 vil falde på den 3. spand og så videre.

Efter den første iteration ser listen nu sådan ud.

Arbejde med Radix Sort Algorithm
Liste efter den første iteration

Som du kan se fra ovenstående figur, er listen ikke sorteret endnu og kræver mere iteration for at være fuldt sorteret.

b) Anden iteration

Arbejde med Radix Sort Algorithm
Sortering baseret på cifre på tiere

I denne iteration vil vi overveje tallet ved 10th sted for sorteringsprocessen.

Trin 1) Divider de heltal med 10. 248 divideret med 10 giver os 24.

Trin 2) Mod output fra trin 1 med 10. 24 mod 10 giver os 4.

Trin 3) Følg trin 2 fra den forrige iteration.

Efter den anden iteration ser listen nu sådan ud

Arbejde med Radix Sort Algorithm
Liste efter anden iteration

Du kan se fra ovenstående figur, at listen stadig ikke er helt sorteret, da den ikke er i stigende rækkefølge endnu.

c) Tredje iteration

Arbejde med Radix Sort Algorithm
Sortering baseret på cifrene hundredvis af steder

Til den endelige iteration ønsker vi at få det mest signifikante ciffer. I dette tilfælde er det 100th plads for hvert af de heltal på listen.

Trin 1) Divider hele tallene med 100... 415 divideret med 100 giver os 4.

Trin 2) Mod resultatet fra trin 1 med 10. 4 mod 10 giver os 4 igen.

Trin 3) Følg trin 3 fra den forrige iteration.

Arbejde med Radix Sort Algorithm
Liste efter tredje iteration

Som vi kan se, er listen nu sorteret i stigende rækkefølge. Den endelige iteration er afsluttet, og sorteringsprocessen er nu afsluttet.

Pseudokode for Radix Sort Algorithm

Her er pseudokoden for Radix Sort Algorithm

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++ Program til implementering af 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);
}

Output:

162 248 415 623 835

Python Program til Radix Sort Algorithm

#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)

Output:

[162,248,415,623,835]

Kompleksitetsanalyse af Radix Sort

Der er to typer kompleksitet at overveje, rumkompleksitet og tidskompleksitet.

  • Rumkompleksitet: O(n+b), hvor n er størrelsen af ​​arrayet, og b er den betragtede base.
  • Tidskompleksitet: O(d*(n+b)) hvor d er antallet af cifre i det største element i arrayet.

Rumkompleksiteten af ​​Radix Sort

To funktioner at fokusere på for rummets kompleksitet

  • Antal elementer i arrayet, n.
  • Grundlaget for at repræsentere elementerne, b.

Nogle gange kan denne base være større end størrelsen af ​​arrayet.

Den overordnede kompleksitet er således O(n+b).

Følgende egenskaber for elementerne på listen kan gøre radix-sorteringspladsen ineffektiv:

  • Elementer med et stort antal cifre.
  • Basen af ​​elementerne er stor, ligesom 64-bit tal.

Tidskompleksitet af Radix Sort

Du kan bruge tællesorten som en underrutine, da hver iteration vil tagee O(n+b) tid. Hvis der findes d iterationer, bliver den samlede køretid O(d*(n+b)). Her betyder "O" kompleksitetsfunktionen.

Linearitet af Radix Sort

Radix Sort er lineær hvornår

  • d er konstant, hvor d er antallet af cifre i det største grundstof.
  • b er ikke større i særlig grad i forhold til n.

Sammenligninger af Radix Sort med andre komparative algoritmer

Som vi har set, er Radix-sortens kompleksitet baseret på en ord- eller talstørrelse. Det vil have samme kompleksitet for de gennemsnitlige og bedste sager. Og det er O(d*(n+b)). Det er også forskelligt alt efter den sorteringsteknik, du bruger i midten. For eksempel kan du bruge tællesortering eller hurtig sortering til den mellemliggende sorteringsalgoritme inde i Radix-sorteringen.

Anvendelser af Radix Sort Algorithm

Vigtige anvendelser af Radix Sort er:

  • Radix Sort kan bruges som en lokationsfindingsalgoritme, hvor der bruges store værdiområder.
  • Det bruges til at konstruere et suffiksarray i DC3-algoritmen.
  • Det bruges i en sekventiel, tilfældig adgangsmaskine, der er til stede i en typisk computer, hvor optegnelser indtastes.