Radix-sorteeralgoritme in gegevensstructuur

Wat is het Radix sorteeralgoritme?

Radix Sort is een niet-vergelijkend sorteeralgoritme. Het werkt door de afzonderlijke cijfers van de te sorteren elementen te groeperen. Vervolgens wordt een stabiele sorteertechniek gebruikt om de elementen te ordenen op basis van hun radix. Het is een lineair sorteeralgoritme.

Het sorteerproces omvat de volgende eigenschappen:

  • Het maximale element vinden en het aantal cijfers van dat element verkrijgen. Het geeft ons het aantal iteraties dat het sorteerproces zal volgen.
  • Groepeer de individuele cijfers van de elementen op dezelfde significante positie in elke iteratie.
  • Het groeperingsproces begint bij het minst significante cijfer en eindigt bij het meest significante cijfer.
  • De elementen sorteren op basis van cijfers op die significante positie.
  • Het behouden van de relatieve volgorde van elementen die dezelfde sleutelwaarde hebben. Deze eigenschap van de radix-soort maakt het een stabiele sortering.

De laatste iteratie geeft ons een volledig gesorteerde lijst.

Werking van het Radix Sort-algoritme

Werking van het Radix Sort-algoritme
Lijst met gehele getallen die moeten worden gesorteerd

Laten we proberen de lijst met gehele getallen in de bovenstaande afbeelding in oplopende volgorde te sorteren met behulp van het Radix Sort-algoritme.

Hier zijn de stappen om het Radix-sorteerproces uit te voeren:

Stap 1) Identificeer het element met de maximale waarde in de lijst. In dit geval is dat 835.

Stap 2) Bereken het aantal cijfers van het maximale element. 835 heeft precies 3 cijfers.

Stap 3) Bepaal het aantal iteraties op basis van stap 2. 835 heeft 3 cijfers, wat betekent dat het aantal iteraties 3 zal zijn.

Stap 4) Bepaal de basis van de elementen. Omdat dit een decimaal systeem is, is de grondtal 10.

Stap 5) Start de eerste iteratie.

a) Eerste iteratie

Werking van het Radix Sort-algoritme
Sorteren op het laatste cijfer

In de eerste iteratie houden we rekening met de eenheidswaarde van elk element.

Stap 1) Wijzig het gehele getal met 10 om de eenheidsplaats van de elementen te krijgen. 623 mod 10 geeft ons bijvoorbeeld de waarde 3, en 248 mod 10 geeft ons 8.

Stap 2) Gebruik telsortering of een andere stabiele sortering om de gehele getallen te ordenen op basis van hun minst significante cijfer. Zoals uit de figuur blijkt, zal 248 op de 8e emmer vallen. 623 zal op de derde emmer vallen, enzovoort.

Na de eerste iteratie ziet de lijst er nu als volgt uit.

Werking van het Radix Sort-algoritme
Lijst na de eerste iteratie

Zoals u in de bovenstaande afbeelding kunt zien, is de lijst nog niet gesorteerd en is er meer iteratie nodig om volledig te kunnen worden gesorteerd.

b) Tweede iteratie

Werking van het Radix Sort-algoritme
Sortering op basis van cijfers op de plaats van de tientallen

In deze iteratie beschouwen we het cijfer bij de 10th plaats voor het sorteerproces.

Stap 1) Deel de gehele getallen door 10. 248 gedeeld door 10 geeft ons 24.

Stap 2) Mod de uitvoer van stap 1 bij 10. 24 mod 10 geeft ons 4.

Stap 3) Volg stap 2 van de vorige iteratie.

Na de tweede iteratie ziet de lijst er nu als volgt uit

Werking van het Radix Sort-algoritme
Lijst na de tweede iteratie

U kunt aan de bovenstaande figuur zien dat de lijst nog steeds niet volledig is gesorteerd, aangezien deze nog niet in oplopende volgorde staat.

c) Derde iteratie

Werking van het Radix Sort-algoritme
Sortering op basis van de cijfers op honderden plaatsen

Voor de laatste iteratie willen we het meest significante cijfer verkrijgen. In dit geval is dat de 100th plaats voor elk van de gehele getallen in de lijst.

Stap 1) Deel de gehele getallen door 100... 415 gedeeld door 100 geeft ons 4.

Stap 2) Mod het resultaat van stap 1 bij 10. 4 mod 10 geeft ons weer 4.

Stap 3) Volg stap 3 van de vorige iteratie.

Werking van het Radix Sort-algoritme
Lijst na de derde iteratie

Zoals we kunnen zien, is de lijst nu in oplopende volgorde gesorteerd. De laatste iteratie is voltooid en het sorteerproces is nu voltooid.

Pseudocode van Radix Sorteeralgoritme

Hier is de pseudocode voor het Radix Sort-algoritme

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++ Programma om Radix Sort te implementeren

#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 Programma voor Radix Sorteeralgoritme

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

Complexiteitsanalyse van Radix Sort

Er zijn twee soorten complexiteit: ruimtelijke complexiteit en tijdscomplexiteit.

  • Ruimtecomplexiteit: O(n+b) waarbij n de grootte van de matrix is ​​en b de beschouwde basis.
  • Tijdcomplexiteit: O(d*(n+b)) waarbij d het aantal cijfers is van het grootste element in de matrix.

Ruimtecomplexiteit van radixsortering

Twee kenmerken waarop u zich moet concentreren voor ruimtelijke complexiteit

  • Aantal elementen in de array, n.
  • De basis voor het weergeven van de elementen, b.

Soms kan deze basis groter zijn dan de grootte van de array.

De totale complexiteit is dus O(n+b).

De volgende eigenschappen van de elementen in de lijst kunnen de radixsorteerruimte inefficiënt maken:

  • Elementen met een groot aantal cijfers.
  • De basis van de elementen is groot, zoals 64-bits getallen.

Tijdcomplexiteit van radixsortering

U kunt het tellen als een subroutine gebruiken, aangezien elke iteratie zal dureneO(n+b) tijd. Als er iteraties bestaan, wordt de totale looptijd O(d*(n+b)). Hierbij staat “O” voor de complexiteitsfunctie.

Lineariteit van Radix-sortering

Radix Sortering is lineair wanneer

  • d is constant, waarbij d het aantal cijfers van het grootste element is.
  • b is niet veel groter dan n.

Vergelijkingen van Radix Sort met andere vergelijkende algoritmen

Zoals we hebben gezien, is de complexiteit van de Radix sort gebaseerd op een woord- of nummergrootte. Het zal dezelfde complexiteit hebben voor de gemiddelde en beste gevallen. En dat is O(d*(n+b)). Het verschilt ook afhankelijk van de sorteertechniek die u in het midden gebruikt. U kunt bijvoorbeeld counting sort of quick sort gebruiken voor het tussenliggende sorteeralgoritme binnen de Radix sort.

Toepassingen van het Radix Sort-algoritme

Belangrijke toepassingen van Radix Sort zijn:

  • Radix Sort kan worden gebruikt als algoritme voor het vinden van locaties waarbij grote waardenbereiken worden gebruikt.
  • Het wordt gebruikt bij het construeren van een achtervoegselarray in het DC3-algoritme.
  • Het wordt gebruikt in een sequentiële, willekeurig toegankelijke machine in een typische computer waar gegevens worden ingevoerd.