Radix-sorteringsalgoritme i datastruktur

⚡ Smart opsummering

Radix Sort er en ikke-komparativ lineær sorteringsalgoritme, der grupperer heltal efter cifferposition ved hjælp af en stabil subrutine, såsom tællesortering. Den sorterer tal, strenge og nøgler med fast bredde hurtigere end sammenligningsbaserede sorteringer for mange input.

  • 🎯 Kerneidé: Radix Sort behandler hvert ciffer i hvert element fra mindst signifikant til mest signifikant, fordeler værdier i buckets og samler arrayet igen ved hver gennemgang.
  • 🇧🇷 Stabil subrutine: En stabil indre sortering, ligesom tællesortering, bevarer den tidligere rækkefølge af lige cifre, hvilket er afgørende for, at det endelige resultat kan sorteres fuldt ud.
  • 🧭 Udarbejdet eksempel: Tre iterationer over arrayet {162, 623, 835, 415, 248} på ener-, ti- og hundredtalkolonner producerer det sorterede output {162, 248, 415, 623, 835}.
  • 💻 Sprog: C++ og Python Implementeringer bruger tællende sortering som den stabile indre pass.
  • 📊 kompleksitet: Tidskompleksiteten er O(d*(n + b)) og rumkompleksiteten er O(n + b), hvor n er arraystørrelsen, b er grundtallet, og d er antallet af cifre.
  • 🏭 Applikationer: Konstruktion af suffiksarrays med DC3-algoritmen, placeringsfinding på brede værdiintervaller og nøglebaseret sortering på maskiner med tilfældig adgang er almindelige anvendelser.

Radix-sorteringsalgoritme i datastruktur

Hvad er Radix Sort Algorithm?

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

Sorteringsprocessen involverer følgende egenskaber:

  • Find det maksimale element og få antallet af cifre for det element. Dette giver antallet af iterationer, som sorteringsprocessen udfører.
  • Grouping de individuelle cifre for elementerne på samme betydende position i hver iteration.
  • Gruppenping Processen starter med det mindst betydende ciffer og slutter ved det mest betydende ciffer.
  • Sortering af elementerne baseret på cifrene på den betydende position.
  • Bevarer den relative rækkefølge af elementer, der har samme nøgleværdi. Denne egenskab ved Radix Sort gør den til en stabil sortering.

Den sidste iteration returnerer en fuldstændig sorteret liste.

Arbejde med Radix Sort Algorithm

Arbejde med Radix Sort Algorithm

Liste over heltal, der skal sorteres

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

Her er trinnene til at udføre Radix Sort-processen:

Trin 1) Identificér det største element på listen. Her er det 835.

Trin 2) Tæl dets cifre. 835 har 3 cifre, så antallet af iterationer er 3.

Trin 3) Bestem grundtallet. Da dette er et decimaltal, er grundtallet 10.

Trin 4) Start den første iteration.

a) Første iteration

Radix Sort-algoritmens funktion: sortering efter sidste ciffer

Sortering efter sidste ciffer

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

Trin 1) Modificer heltallet med 10 for at få elementernes enhedsplads. For eksempel giver 623 mod 10 3, og 248 mod 10 giver 8.

Trin 2) Brug tællesortering eller en anden stabil sortering til at organisere heltallene efter deres mindst betydende ciffer. Ud fra figuren falder 248 i den 8. kategori, 623 falder i den 3. kategori, og så videre.

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

Liste efter den første iteration

Liste efter den første iteration

Listen er ikke sorteret endnu og kræver flere iterationer.

b) Anden iteration

Sortering baseret på cifre på tiere

Sortering baseret på cifre på tiere

I denne iteration betragter vi cifferet på tierpladsen i sorteringsprocessen.

Trin 1) Divider de heltale med 10. For eksempel giver 248 divideret med 10 24.

Trin 2) Modificer outputtet fra trin 1 med 10. 24 mod 10 giver 4.

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

Efter den anden iteration ser listen nu således ud:

Liste efter anden iteration

Liste efter anden iteration

Listen er endnu ikke helt sorteret, da den ikke er i stigende rækkefølge.

c) Tredje iteration

Sortering baseret på cifrene på hundredpladsen

Sortering baseret på cifrene på hundredpladsen

I den sidste iteration ønsker vi at få det mest betydende ciffer. I dette tilfælde er det hundredtallet for hvert af heltallene i listen.

Trin 1) Divider de heltale med 100. For eksempel giver 415 divideret med 100 4.

Trin 2) Modificer resultatet fra trin 1 med 10. 4 mod 10 giver 4.

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

Liste efter tredje iteration

Liste efter tredje iteration

Listen er nu sorteret i stigende rækkefølge. Den sidste iteration er fuldført, og sorteringsprocessen er afsluttet.

Pseudokode for Radix Sort Algorithm

Her er pseudokoden for Radix Sort-algoritmen:

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 in the jth place
    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 integer
    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 in 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

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

Output:

[162, 248, 415, 623, 835]

Kompleksitethedsanalyse 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 grundtal.
  • 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å i forbindelse med rumkompleksitet:

  • Antal elementer i arrayet, n.
  • Basen, der bruges til at repræsentere elementerne, b.

Nogle gange kan denne base være større end størrelsen af ​​arrayet. Den samlede kompleksitet er således O(n + b).

Følgende egenskaber ved elementerne i listen kan gøre Radix Sort-rummet ineffektivt:

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

Tidskompleksitet af Radix Sort

Ved at bruge tællende sortering som en subrutine, tager hver iteration O(n + b) tid. Hvis der findes d iterationer, bliver den samlede køretid O(d * (n + b))Her betegner "O" kompleksitetsfunktionen.

Linearitet af Radix Sort

Radixsortering er lineær når:

  • d er konstant, hvor d er antallet af cifre i det største grundstof.
  • b er ikke væsentligt større end n.

Sammenligning af Radix Sort med anden sortering Algorithms

Radix Sorts kompleksitet afhænger af tallets størrelse. Bedste-case og average-case er begge O(d * (n + b)). Ydeevnen varierer med den indre sortering — tællesortering er standard, men enhver stabil sortering fungerer.

Anvendelser af Radix Sort Algorithm

Vigtige anvendelser af Radix Sort er:

  • Radix Sort kan bruges som en lokationsfindingsalgoritme, hvor store værdiintervaller er involveret.
  • Det bruges til at konstruere et suffiksarray i DC3-algoritmen.
  • Det bruges i sekventielle maskiner med tilfældig adgang, hvor poster indtastes med identifikatorer med fast bredde.

Ofte Stillede Spørgsmål

Radix Sort accelererer AI-dataforbehandling og GPU-venlig sortering af heltalsnøgler. Vektordatabaser og indlejringspipelines bruger også radix-lignende partitionering til nærmeste nabo-buckets.

Ja. GitHub Copilot og GPT kan generere Radix Sort i Python, C++, Java, eller Rust, inklusive LSD- og MSD-varianter og -versioner, der sorterer strenge eller binære nøgler med fast bredde.

Radix Sort slår Quick Sort på store heltalsmatrixer med små cifre, fordi den undgår sammenligninger. På generelle data eller flydende kommaværdier er den ofte langsommere end Quick Sort.

Radix Sort er stabil, når den indre sortering er stabil, såsom tællesortering. Den er ikke på plads, fordi bucket-arrays af størrelse O(n + b) er nødvendige ud over input-arrayet.

LSD Radix Sort behandler cifre fra mindste til mest betydende og passer til heltal med fast bredde. MSD Radix Sort starter fra det mest betydende ciffer og passer til strenge med variabel længde.

Standard Radix Sort antager ikke-negative heltal. Negative værdier håndteres ved at forskyde værdier med minimumsværdien for arrayet eller ved at sortere positive og negative værdier i separate gennemgange.

Radix Sort driver konstruktion af suffiksarrays, IP-routingstabeller, databaseindekser, GPU-sorteringskerner, mailrouting efter postnummer og leksikografisk strengsortering i compilere.

Tællesortering er stabil og kører i O(n + b) tid, keeping den samlede Radix Sort-omkostning lineær. Dens stabilitet bevarer rækkefølgen af ​​lige cifre, hvilket multi-pass-strategien kræver.

Opsummer dette indlæg med: