Radix rendezési algoritmus az adatstruktúrában

Mi az a Radix rendezési algoritmus?

A Radix Sort egy nem összehasonlító rendezési algoritmus. Úgy működik, hogy csoportosítja a rendezendő elemek egyes számjegyeit. Ezután egy stabil rendezési technikát alkalmaznak az elemek gyökük szerinti rendszerezésére. Ez egy lineáris rendezési algoritmus.

A válogatási folyamat a következő tulajdonságokat tartalmazza:

  • A maximális elem megkeresése és az adott elem számjegyeinek megszerzése. Megadja az iterációk számát a rendezési folyamat során.
  • Csoportosítsa az elemek egyes számjegyeit minden iterációban ugyanazon a jelentős helyen.
  • A csoportosítási folyamat a legkisebb jelentőségű számjegytől kezdődik, és a legjelentősebb számjegynél ér véget.
  • Az elemek rendezése számjegyek alapján az adott jelentős helyen.
  • Az azonos kulcsértékkel rendelkező elemek relatív sorrendjének fenntartása. A radix rendezés ezen tulajdonsága stabil rendezést biztosít.

Az utolsó iteráció egy teljesen rendezett listát ad nekünk.

A Radix rendezési algoritmus működése

A Radix rendezési algoritmus működése
A rendezendő egész számok listája

Próbáljuk meg a fenti ábrán látható egész számok listáját a Radix Sort algoritmussal növekvő sorrendbe rendezni.

Íme a Radix rendezési folyamat lépései:

Step 1) Azonosítsa a listában a maximális értékű elemet. Ebben az esetben a 835.

Step 2) Számítsa ki a maximális elem számjegyeinek számát! A 835 pontosan 3 számjegyből áll.

Step 3) Határozza meg az iterációk számát a 2. lépés alapján. A 835 3 számjegyű, vagyis az iterációk száma 3 lesz.

Step 4) Határozza meg az elemek alapját! Mivel ez egy tizedes rendszer, az alap 10 lesz.

Step 5) Indítsa el az első iterációt.

a) Első iteráció

A Radix rendezési algoritmus működése
Rendezés az utolsó számjegy szerint

Az első iterációban az egyes elemek egységnyi helyiértékét vesszük figyelembe.

Step 1) Módosítsa az egész számot 10-zel, hogy megkapja az elemek egységhelyét. Például a 623 mod 10 értéke 3, a 248 mod 10 pedig 8.

Step 2) Használja a számláló rendezést vagy bármilyen más stabil rendezést az egész számok legkisebb jelentőségű számjegyük szerinti rendezéséhez. Amint az ábrán látható, a 248 a 8. vödörre esik. A 623 a 3. vödörre fog esni és így tovább.

Az első iteráció után a lista most így néz ki.

A Radix rendezési algoritmus működése
Lista az első iteráció után

Amint az a fenti ábrán látható, a lista még nincs rendezve, és további iterációt igényel a teljes rendezéshez.

b) Második iteráció

A Radix rendezési algoritmus működése
Rendezés számjegyek alapján tízes helyen

Ebben az iterációban a 10-es számjegyet fogjuk figyelembe vennith hely a válogatási folyamathoz.

Step 1) Osszuk el az egész számokat 10-zel. 248 osztva 10-zel 24-et kapunk.

Step 2) Módosítsa az 1. lépés kimenetét 10-re. 24 A 10. mod 4-et ad.

Step 3) Kövesse az előző iteráció 2. lépését.

A második iteráció után a lista most így néz ki

A Radix rendezési algoritmus működése
Lista a második iteráció után

A fenti ábrán látható, hogy a lista még mindig nincs teljesen rendezve, mivel még nincs növekvő sorrendben.

c) Harmadik iteráció

A Radix rendezési algoritmus működése
Rendezés a számjegyek alapján több száz helyen

Az utolsó iterációhoz a legjelentősebb számjegyet szeretnénk megkapni. Ebben az esetben ez a 100th helyet a listában szereplő összes egész számhoz.

Step 1) Osszuk el az egész számokat 100-zal… 415 osztva 100-zal 4-et kapunk.

Step 2) Módosítsa az 1. lépés eredményét 10-re. 4 A mod 10 ismét 4-et ad.

Step 3) Kövesse az előző iteráció 3. lépését.

A Radix rendezési algoritmus működése
Lista a harmadik iteráció után

Amint látjuk, a lista most növekvő sorrendben van rendezve. Az utolsó iteráció befejeződött, és a rendezési folyamat befejeződött.

Radix rendezési algoritmus pszeudokódja

Itt van a Radix Sort Algorithm pszeudokódja

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 a Radix Sort megvalósításához

#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 a Radix rendezési algoritmushoz

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

A Radix Sort komplexitáselemzése

A komplexitásnak két típusát kell figyelembe venni, a térbeli és az időbeli összetettséget.

  • Térkomplexitás: O(n+b) ahol n a tömb mérete, b pedig a figyelembe vett bázis.
  • Időbonyolultság: O(d*(n+b)), ahol d a tömb legnagyobb elemének számjegyeinek száma.

A Radix rendezés térkomplexitása

Két olyan funkció, amelyre összpontosítani kell a tér összetettsége érdekében

  • A tömb elemeinek száma, n.
  • Az elemek ábrázolásának alapja, b.

Néha ez az alap nagyobb lehet, mint a tömb mérete.

A teljes komplexitás tehát O(n+b).

A lista elemeinek következő tulajdonságai miatt a radix rendezési terület nem hatékony:

  • Sok számjegyű elemek.
  • Az elemek alapja nagy, mint a 64 bites számok.

A Radix rendezés időbeli összetettsége

A számláló rendezést használhatja szubrutinként, mivel minden iteráció megtörténike O(n+b) idő. Ha d iteráció létezik, a teljes futási idő a következő lesz O(d*(n+b)). Itt az „O” a komplexitási függvényt jelenti.

Radix rendezés linearitása

A Radix Sort lineáris, amikor

  • d állandó, ahol d a legnagyobb elem számjegyeinek száma.
  • b nem nagy mértékben nagyobb ahhoz képest n.

A Radix Sort összehasonlítása más összehasonlító algoritmusokkal

Amint láttuk, a Radix rendezés összetettsége egy szó vagy szám méretén alapul. Ugyanolyan összetett lesz az átlagos és a legjobb esetekben. Ez pedig O(d*(n+b)). Ezenkívül eltér a középen használt válogatási technikától függően. Például használhatja a számláló rendezést vagy a gyors rendezést a köztes rendezési algoritmushoz a Radix rendezésen belül.

Radix Sort Algorithm alkalmazásai

A Radix Sort fontos alkalmazásai a következők:

  • A Radix Sort helymeghatározó algoritmusként használható, ahol nagy értéktartományokat használnak.
  • A DC3 algoritmusban egy utótag tömb felépítésére használják.
  • Egy szekvenciális, véletlen hozzáférésű gépben használatos, amely egy tipikus számítógépben található, ahol a rekordokat kulcsolják.