Radix sortimise algoritm andmestruktuuris

โšก Nutikas kokkuvรตte

Radix Sort on mittevรตrdlev lineaarne sortimisalgoritm, mis rรผhmitab tรคisarve numbripositsiooni jรคrgi, kasutades stabiilset alamrutiini, nรคiteks loendamissortimist. See sorteerib numbreid, stringe ja fikseeritud laiusega vรตtmeid paljude sisendite puhul kiiremini kui vรตrdluspรตhine sortimine.

  • ๐ŸŽฏ Pรตhiidee: Radix Sort tรถรถtleb iga elemendi iga numbrit alates kรตige vรคhemolulisest kuni kรตige olulisemani, jaotades vรครคrtused รคmbritesse ja pannes massiivi igal lรคbimisel uuesti kokku.
  • โš™๏ธ Stabiilne alamprogramm: Stabiilne sisemine sortimine, nรคiteks loendav sortimine, sรคilitab eelmise vรตrdsete numbrite jรคrjekorra, mis on oluline lรตpptulemuse tรคielikuks sortimiseks.
  • ๐Ÿงญ Tรถรถtatud nรคide: Massiivi {162, 623, 835, 415, 248} kolm iteratsiooni รผhikute, kรผmnete ja sadade veergudel annavad sorteeritud vรคljundi {162, 248, 415, 623, 835}.
  • ๐Ÿ’ป keeled: C++ ja Python implementatsioonid kasutavad stabiilse sisemise lรคbipรครคsuna loendavat sortimist.
  • ๐Ÿ“Š Keerukus: Ajaline keerukus on O(d*(n + b)) ja ruumiline keerukus on O(n + b), kus n on massiivi suurus, b on baas ja d on numbrite arv.
  • ๐Ÿญ Rakendused: Levinud kasutusviisid on sufiksimassiivi konstrueerimine DC3 algoritmiga, asukoha leidmine laiades vรครคrtusvahemikes ja vรตtmepรตhine sortimine juhusliku juurdepรครคsuga masinatel.

Radix sortimise algoritm andmestruktuuris

Mis on Radixi sortimise algoritm?

Radix Sort on mittevรตrdlev sortimisalgoritm. See tรถรถtab rรผhmade kaupa.ping sorteeritavate elementide รผksikud numbrid. Seejรคrel kasutatakse elementide korraldamiseks nende radixi alusel stabiilset sortimistehnikat. See on lineaarne sortimisalgoritm.

Sorteerimisprotsess hรตlmab jรคrgmisi omadusi:

  • Maksimaalse elemendi leidmine ja selle elemendi numbrite arvu saamine. See annab sortimisprotsessi kรคigus tehtavate iteratsioonide arvu.
  • Grouping iga iteratsiooni samal olulisel positsioonil olevate elementide รผksikud numbrid.
  • Sahjuping Protsess algab kรตige vรคiksema tรคhtsusega numbrist ja lรตpeb kรตige suurema tรคhtsusega numbriga.
  • Elementide sorteerimine selle olulise positsiooni numbrite pรตhjal.
  • Sama vรตtmevรครคrtusega elementide suhtelise jรคrjestuse sรคilitamine. See Radix Sorti omadus muudab selle stabiilseks sortimiseks.

Viimane iteratsioon tagastab tรคielikult sorteeritud loendi.

Radixi sortimise algoritmi tรถรถ

Radixi sortimise algoritmi tรถรถ

Sorteeritavate tรคisarvude loend

Sorteerime รผlaltoodud joonisel olevad tรคisarvud radikaalsortimise abil kasvavas jรคrjekorras.

Radixi sortimise protsessi teostamiseks toimige jรคrgmiselt.

Step 1) Tuvasta loendi suurim element. Siin on see 835.

Step 2) Loe selle numbrid kokku. Arv 835 on kolmekohaline, seega on iteratsioonide arv 3.

Step 3) Mรครคrake alus. Kuna see on kรผmnendmurd, on alus 10.

Step 4) Alustage esimest iteratsiooni.

a) Esimene iteratsioon

Radixi sortimisalgoritmi tรถรถpรตhimรตte: sorteerimine viimase numbri jรคrgi

Sorteerimine viimase numbri jรคrgi

Esimeses iteratsioonis arvestame iga elemendi รผhikulise kohavรครคrtusega.

Step 1) Elementide รผhikukoha saamiseks modifitseeri tรคisarvu 10 vรตrra. Nรคiteks 623 mod 10 annab tulemuseks 3 ja 248 mod 10 annab tulemuseks 8.

Step 2) Kasutage loendamissortimist vรตi muud stabiilset sortimist, et korraldada tรคisarvud nende vรคhimolulise numbri jรคrgi. Jooniselt langeb 248 8. รคmbrisse, 623 3. รคmbrisse jne.

Pรคrast esimest iteratsiooni nรคeb nimekiri nรผรผd vรคlja selline.

Loetelu pรคrast esimest iteratsiooni

Loetelu pรคrast esimest iteratsiooni

Nimekiri pole veel sorteeritud ja vajab rohkem kordamist.

b) Teine iteratsioon

Sorteerimine kรผmnendkoha numbrite alusel

Sorteerimine kรผmnendkoha numbrite alusel

Selles iteratsioonis vaatleme sortimisprotsessi jaoks kรผmneliste kohta.

Step 1) Jaga tรคisarvud 10-ga. Nรคiteks 248 jagamisel 10-ga saame 24.

Step 2) Modifitseeri 1. sammu vรคljundit 10 vรตrra. 24 modifitseeri 10 annab tulemuseks 4.

Step 3) Jรคrgige eelmise iteratsiooni 2. sammu.

Pรคrast teist korda lรคbimist nรคeb nimekiri vรคlja selline:

Nimekiri pรคrast teist iteratsiooni

Nimekiri pรคrast teist iteratsiooni

Nimekiri pole veel tรคielikult sorteeritud, kuna see pole veel kasvavas jรคrjekorras.

c) Kolmas iteratsioon

Sorteerimine sajaliste numbrite jรคrgi

Sorteerimine sajaliste numbrite jรคrgi

Viimase iteratsiooni jaoks tahame leida kรตige olulisema numbri. Antud juhul on see iga loendis oleva tรคisarvu sajandik.

Step 1) Jaga tรคisarvud 100-ga. Nรคiteks 415 jagamisel 100-ga saame 4.

Step 2) Modifitseeri 1. sammu tulemust 10 vรตrra. 4 modifitseeri 10 annab tulemuseks 4.

Step 3) Jรคrgige eelmise iteratsiooni 3. sammu.

Loetelu pรคrast kolmandat iteratsiooni

Loetelu pรคrast kolmandat iteratsiooni

Loend on nรผรผd kasvavas jรคrjekorras sorteeritud. Viimane iteratsioon on lรตpule viidud ja sortimisprotsess on lรตppenud.

Radixi sortimisalgoritmi pseudokood

Siin on Radixi sortimisalgoritmi pseudokood:

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++ Programm Radix Sorti rakendamiseks

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

Vรคljund:

162 248 415 623 835

Python Programm Radix Sort Algorithmi jaoks

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

Vรคljund:

[162, 248, 415, 623, 835]

Radix-sortimise keerukusanalรผรผs

Arvesse tuleb vรตtta kahte tรผรผpi keerukust: ruumi keerukus ja aja keerukus.

  • Ruumi keerukus: O(n + b), kus n on massiivi suurus ja b on vaadeldav baas.
  • Ajaline keerukus: O(d * (n + b)), kus d on massiivi suurima elemendi numbrite arv.

Radixi sortimise ruumi keerukus

Ruumi keerukuse puhul tuleks keskenduda kahele omadusele:

  • Massiivi elementide arv, n.
  • Elementide kujutamiseks kasutatav alus, b.

Mรตnikord vรตib see baas olla suurem kui massiivi suurus. Seega on รผldine keerukus O(n + b).

Loendi elementide jรคrgmised omadused vรตivad muuta Radixi sortimisruumi ebaefektiivseks:

  • Suure arvu numbritega elemendid.
  • Elementide alus on suur, nagu 64-bitised numbrid.

Radixi sortimise ajaline keerukus

Loendava sortimise kasutamisel alamprogrammina vรตtab iga iteratsioon aega O(n + b) aega. Kui d iteratsioonid on olemas, muutub kogu tรถรถaeg O(d * (n + b))Siin tรคhistab โ€žOโ€ keerukusfunktsiooni.

Radixi sortimise lineaarsus

Radix-sortimine on lineaarne, kui:

  • d on konstantne, kus d on suurima elemendi numbrite arv.
  • b ei ole oluliselt suurem kui n.

Radixi sortimise vรตrdlus teiste sortimistega Algorithms

Radix-sortimise keerukus sรตltub arvu suurusest. Nii parim kui ka keskmine juhtum on O(d * (n + b)). Jรตudlus varieerub olenevalt sisemisest sortimisest โ€“ loendav sortimine on standardne, kuid iga stabiilne sortimine tรถรถtab.

Radixi sortimise algoritmi rakendused

Radix Sortimise olulised rakendused on:

  • Radix Sortimist saab kasutada asukoha leidmise algoritmina, kui tegemist on suurte vรครคrtusvahemikega.
  • Seda kasutatakse DC3 algoritmis sufiksimassiivi konstrueerimiseks.
  • Seda kasutatakse jรคrjestikustes, muutpรถรถrdusega masinates, kus kirjed on vรตtmestatud fikseeritud laiusega identifikaatoritega.

KKK

Radix Sort kiirendab tehisintellekti andmete eeltรถรถtlust ja GPU-sรตbralikku tรคisarvuliste vรตtmete sortimist. Vektorandmebaasid ja manustamiskanalid kasutavad lรคhima naabri รคmbrite jaoks samuti radix-stiilis partitsioonimist.

Jah. GitHub Copilot ja GPT saavad genereerida Radix Sort'i Python, C++, Javavรตi Rust, sealhulgas LSD ja MSD variandid ja versioonid, mis sorteerivad stringe vรตi fikseeritud laiusega binaarvรตtmeid.

Radix Sort on kiirest sortimisest parem suurte ja vรคikese numbrite arvuga tรคisarvuliste massiivide puhul, kuna see vรคldib vรตrdlusi. รœldandmete vรตi ujukomavรครคrtuste puhul on see sageli kiirest sortimisest aeglasem.

Radix-sortimine on stabiilne, kui sisemine sortimine on stabiilne, nรคiteks loendamissortimine. See ei ole paigas, sest lisaks sisendmassiivile on vaja ka O(n + b) suurusega รคmbrimassiive.

LSD Radix Sort tรถรถtleb numbreid vรคhimast kรตige olulisemani ja sobib fikseeritud laiusega tรคisarvudele. MSD Radix Sort alustab kรตige olulisemast numbrist ja sobib muutuva pikkusega stringidele.

Standardne radikaalsortimine eeldab mittenegatiivseid tรคisarve. Negatiivseid arve kรคsitletakse vรครคrtuste nihutamisega massiivi miinimumi vรตrra vรตi positiivsete ja negatiivsete arvude eraldi sortimisega.

Radix Sort toetab kompilaatorites sufiksimassiivide loomist, IP-marsruutimistabeleid, andmebaasi indekseid, GPU sortimise kerneleid, postiindeksi jรคrgi postitamist ja leksikograafilist stringide sortimist.

Loendava sorteerimise stabiilne ja kestab O(n + b) aja, keeping Radixi sortimise kogukulu lineaarne. Selle stabiilsus sรคilitab vรตrdsete numbrite jรคrjekorra, mida mitme lรคbimisega strateegia nรตuab.

Vรตta see postitus kokku jรคrgmiselt: