Radix sorteringsalgoritme i datastruktur

โšก Smart oppsummering

Radix Sort er en ikke-komparativ lineรฆr sorteringsalgoritme som grupperer heltall etter sifferposisjon ved hjelp av en stabil subrutine som tellesortering. Den sorterer tall, strenger og nรธkler med fast bredde raskere enn sammenligningsbaserte sorteringer for mange inndata.

  • ๐ŸŽฏ Kjerneide: Radix Sort behandler hvert siffer i hvert element fra minst signifikant til mest signifikant, fordeler verdier i bรธtter og setter sammen matrisen pรฅ nytt i hver omgang.
  • โš™๏ธ Stabil subrutine: En stabil indre sortering, som tellende sortering, bevarer den forrige rekkefรธlgen med like sifre, noe som er avgjรธrende for at det endelige resultatet skal bli fullstendig sortert.
  • ๐Ÿงญ Utarbeidet eksempel: Tre iterasjoner over matrisen {162, 623, 835, 415, 248} pรฅ enheter, tiere og hundrere-kolonner produserer det sorterte resultatet {162, 248, 415, 623, 835}.
  • ๐Ÿ’ป sprรฅk: C++ og Python Implementeringer bruker tellende sortering som det stabile indre passet.
  • ๐Ÿ“Š kompleksitet: Tidskompleksiteten er O(d*(n + b)) og romkompleksiteten er O(n + b), hvor n er arraystรธrrelsen, b er grunntallet og d er antall sifre.
  • ๐Ÿญ Bruksomrรฅder: Konstruksjon av suffiksarrayer med DC3-algoritmen, stedsfunn pรฅ brede verdiomrรฅder og nรธkkelbasert sortering pรฅ maskiner med tilfeldig tilgang er vanlige bruksomrรฅder.

Radix sorteringsalgoritme i datastruktur

Hva er Radix Sort Algorithm?

Radix Sort er en ikke-komparativ sorteringsalgoritme. Den fungerer etter grupperingping de individuelle sifrene til elementene som skal sorteres. En stabil sorteringsteknikk brukes deretter til รฅ organisere elementene basert pรฅ deres radiks. Det er en lineรฆr sorteringsalgoritme.

Sorteringsprosessen involverer fรธlgende egenskaper:

  • Finne det stรธrste elementet og fรฅ antall sifre for det elementet. Dette gir antall iterasjoner sorteringsprosessen utfรธrer.
  • Grouping de individuelle sifrene til elementene pรฅ samme signifikante posisjon i hver iterasjon.
  • Gruppenping Prosessen starter med det minst signifikante sifferet og slutter med det mest signifikante sifferet.
  • Sortering av elementene basert pรฅ sifrene pรฅ den signifikante posisjonen.
  • Opprettholder den relative rekkefรธlgen av elementer som har samme nรธkkelverdi. Denne egenskapen til Radix Sort gjรธr den til en stabil sortering.

Den siste iterasjonen returnerer en fullstendig sortert liste.

Arbeid av Radix Sort Algorithm

Arbeid av Radix Sort Algorithm

Liste over heltall som skal sorteres

La oss sortere listen over heltall i figuren ovenfor i stigende rekkefรธlge ved hjelp av Radix Sort.

Her er trinnene for รฅ utfรธre Radix Sort-prosessen:

Trinn 1) Identifiser det stรธrste elementet i listen. Her er det 835.

Trinn 2) Tell sifrene. 835 har 3 sifre, sรฅ antallet iterasjoner er 3.

Trinn 3) Bestem grunntallet. Siden dette er et desimaltall, er grunntallet 10.

Trinn 4) Start den fรธrste iterasjonen.

a) Fรธrste iterasjon

Funksjon av Radix Sort-algoritmen sortering etter siste siffer

Sortering etter siste siffer

I den fรธrste iterasjonen tar vi for oss enhetsplassverdien til hvert element.

Trinn 1) Modifiser heltallet med 10 for รฅ fรฅ enhetsplassen til elementene. For eksempel gir 623 mod 10 3, og 248 mod 10 gir 8.

Trinn 2) Bruk tellesortering eller en annen stabil sortering for รฅ organisere heltallene etter deres minst signifikante siffer. Fra figuren faller 248 inn i den รฅttende kategorien, 623 faller inn i den tredje kategorien, og sรฅ videre.

Etter den fรธrste iterasjonen ser listen nรฅ slik ut.

Liste etter fรธrste iterasjon

Liste etter fรธrste iterasjon

Listen er ikke sortert ennรฅ og krever flere iterasjoner.

b) Andre iterasjon

Sortering basert pรฅ sifre pรฅ tiere

Sortering basert pรฅ sifre pรฅ tiere

I denne iterasjonen tar vi for oss sifferet pรฅ tiendeplassen i sorteringsprosessen.

Trinn 1) Del heltallene med 10. For eksempel gir 248 delt pรฅ 10 24.

Trinn 2) Modifiser utgangen fra trinn 1 med 10. 24 mod 10 gir 4.

Trinn 3) Fรธlg trinn 2 fra forrige iterasjon.

Etter den andre iterasjonen ser listen nรฅ slik ut:

Liste etter den andre iterasjonen

Liste etter den andre iterasjonen

Listen er fortsatt ikke fullstendig sortert, da den ikke er i stigende rekkefรธlge ennรฅ.

c) Tredje iterasjon

Sortering basert pรฅ sifrene pรฅ hundreplass

Sortering basert pรฅ sifrene pรฅ hundreplass

For den siste iterasjonen รธnsker vi รฅ fรฅ det mest signifikante sifferet. I dette tilfellet er det hundrerplassen for hvert av heltallene i listen.

Trinn 1) Del heltallene med 100. For eksempel gir 415 delt pรฅ 100 4.

Trinn 2) Modifiser resultatet fra trinn 1 med 10. 4 mod 10 gir 4.

Trinn 3) Fรธlg trinn 3 fra forrige iterasjon.

Liste etter den tredje iterasjonen

Liste etter den tredje iterasjonen

Listen er nรฅ sortert i stigende rekkefรธlge. Den siste iterasjonen er fullfรธrt, og sorteringsprosessen er ferdig.

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 for รฅ implementere 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);
}

Utgang:

162 248 415 623 835

Python Program for 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)

Utgang:

[162, 248, 415, 623, 835]

Kompleksitethetsanalyse av Radix Sort

Det er to typer kompleksitet รฅ vurdere: romkompleksitet og tidskompleksitet.

  • Romkompleksitet: O(n + b) hvor n er stรธrrelsen pรฅ tabellen og b er basen som vurderes.
  • Tidskompleksitet: O(d * (n + b)) hvor d er antall sifre i det stรธrste elementet i tabellen.

Romkompleksiteten til Radix Sort

To funksjoner รฅ fokusere pรฅ for romkompleksitet:

  • Antall elementer i matrisen, n.
  • Basen som brukes til รฅ representere elementene, b.

Noen ganger kan denne basen vรฆre stรธrre enn stรธrrelsen pรฅ tabellen. Den totale kompleksiteten er dermed O(n + b).

Fรธlgende egenskaper ved elementene i listen kan gjรธre Radix Sort-plass ineffektiv:

  • Elementer med et stort antall sifre.
  • Basen av elementene er stor, som 64-bit tall.

Tidskompleksiteten til Radix Sort

Ved รฅ bruke tellende sortering som en subrutine, tar hver iterasjon O(n + b) tid. Hvis det finnes d iterasjoner, blir den totale kjรธretiden O(d * (n + b))Her betegner ยซOยป kompleksitetsfunksjonen.

Linearitet av Radix Sort

Radixsortering er lineรฆr nรฅr:

  • d er konstant, der d er antall sifre i det stรธrste elementet.
  • b er ikke vesentlig stรธrre enn n.

Sammenligning av Radix Sort med annen sortering Algorithms

Radix Sorts kompleksitet avhenger av tallstรธrrelsen. Best-case og average-case er begge O(d * (n + b)). Ytelsen varierer med den indre sorteringen โ€“ tellesortering er standard, men enhver stabil sortering fungerer.

Anvendelser av Radix Sort Algorithm

Viktige bruksomrรฅder for Radix Sort er:

  • Radix Sort kan brukes som en algoritme for stedsfinning der store verdiomrรฅder er involvert.
  • Den brukes til รฅ konstruere en suffiksmatrise i DC3-algoritmen.
  • Den brukes i sekvensielle maskiner med tilfeldig tilgang der poster tastes inn med identifikatorer med fast bredde.

Spรธrsmรฅl og svar

Radix Sort akselererer forbehandling av AI-data og GPU-vennlig sortering av heltallsnรธkler. Vektordatabaser og innebygde pipelines bruker ogsรฅ partisjonering i radix-stil for nรฆrmeste nabo-bรธtter.

Ja. GitHub Copilot og GPT kan generere Radix Sort i Python, C++, Java, eller Rust, inkludert LSD- og MSD-varianter og -versjoner som sorterer strenger eller binรฆre nรธkler med fast bredde.

Radix Sort slรฅr hurtigsortering pรฅ store heltallsmatriser med smรฅ sifre fordi den unngรฅr sammenligninger. Pรฅ generelle data eller flyttallsverdier er den ofte tregere enn hurtigsortering.

Radix Sort er stabil nรฅr den indre sorteringen er stabil, for eksempel tellende sortering. Den er ikke pรฅ plass, fordi bรธttematriser av stรธrrelse O(n + b) kreves i tillegg til inputmatrisen.

LSD Radix Sort behandler sifre fra minst til mest signifikant og passer til heltall med fast bredde. MSD Radix Sort starter fra det mest signifikante sifferet og passer til strenger med variabel lengde.

Standard Radix Sort forutsetter ikke-negative heltall. Negative verdier hรฅndteres ved รฅ forskyve verdier med minimumsverdien i arrayet, eller ved รฅ sortere positive og negative verdier i separate omganger.

Radix Sort driver konstruksjon av suffiksarrayer, IP-rutingstabeller, databaseindekser, GPU-sorteringskjerner, e-postruting etter postnummer og leksikografisk strengsortering i kompilatorer.

Tellesortering er stabil og kjรธrer i O(n + b) tid, keeping den totale Radix Sort-kostnaden lineรฆr. Stabiliteten bevarer rekkefรธlgen med like sifre, noe flerpassstrategien krever.

Oppsummer dette innlegget med: