Algoritmo di ordinamento radicale nella struttura dei dati

Cos'รจ l'algoritmo Radix Sort?

Radix Sort รจ un algoritmo di ordinamento non comparativo. Funziona raggruppando le singole cifre degli elementi da ordinare. Viene quindi utilizzata una tecnica di ordinamento stabile per organizzare gli elementi in base alla loro radice. รˆ un algoritmo di ordinamento lineare.

Il processo di ordinamento coinvolge le seguenti proprietร :

  • Trovare l'elemento massimo e acquisire il numero di cifre di quell'elemento. Ci dร  il numero di iterazioni che seguirร  il processo di ordinamento.
  • Raggruppare le singole cifre degli elementi nella stessa posizione significativa in ciascuna iterazione.
  • Il processo di raggruppamento inizierร  dalla cifra meno significativa e terminerร  con la cifra piรน significativa.
  • Ordinamento degli elementi in base alle cifre in quella posizione significativa.
  • Mantenimento dell'ordine relativo degli elementi che hanno lo stesso valore chiave. Questa proprietร  del radix sort lo rende un ordinamento stabile.

L'iterazione finale ci fornirร  un elenco completamente ordinato.

Funzionamento dell'algoritmo Radix Sort

Funzionamento dell'algoritmo Radix Sort
Elenco di numeri interi da ordinare

Proviamo a ordinare l'elenco di numeri interi nella figura sopra in ordine crescente utilizzando l'algoritmo Radix Sort.

Ecco i passaggi per eseguire il processo di ordinamento radicale:

Passo 1) Identificare l'elemento con il valore massimo nell'elenco. In questo caso รจ 835.

Passo 2) Calcolare il numero di cifre dell'elemento massimo. 835 ha esattamente 3 cifre.

Passo 3) Determinare il numero di iterazioni in base al passaggio 2. 835 ha 3 cifre, il che significa che il numero di iterazioni sarร  3.

Passo 4) Determinare la base degli elementi. Poichรฉ si tratta di un sistema decimale, la base sarร  10.

Passo 5) Avvia la prima iterazione.

a) Prima iterazione

Funzionamento dell'algoritmo Radix Sort
Ordinamento in base all'ultima cifra

Nella prima iterazione, consideriamo il valore posizionale unitario di ciascun elemento.

Passo 1) Modifica il numero intero per 10 per ottenere il posto unitario degli elementi. Ad esempio, 623 mod 10 ci dร  il valore 3 e 248 mod 10 ci dร  8.

Passo 2) Utilizzare l'ordinamento di conteggio o qualsiasi altro ordinamento stabile per organizzare gli interi in base alla cifra meno significativa. Come si vede dalla figura, 248 cadranno nell'ottavo secchio. 8 cadranno sul 623ยฐ secchio e cosรฌ via.

Dopo la prima iterazione, l'elenco ora appare cosรฌ.

Funzionamento dell'algoritmo Radix Sort
Elenco dopo la prima iterazione

Come puoi vedere dalla figura sopra, l'elenco non รจ ancora ordinato e richiede piรน iterazioni per essere completamente ordinato.

b) Seconda iterazione

Funzionamento dell'algoritmo Radix Sort
Ordinamento in base alle cifre delle decine

In questa iterazione, considereremo la cifra 10th posto per il processo di smistamento.

Passo 1) Dividi i numeri interi per 10. 248 diviso per 10 dร  24.

Passo 2) Modifica l'output del passaggio 1 per 10. 24 mod 10 ci dร  4.

Passo 3) Seguire il passaggio 2 dell'iterazione precedente.

Dopo la seconda iterazione, l'elenco ora appare cosรฌ

Funzionamento dell'algoritmo Radix Sort
Elenco dopo la seconda iterazione

Puoi vedere dalla figura sopra che l'elenco non รจ ancora completamente ordinato poichรฉ non รจ ancora in ordine crescente.

c) Terza iterazione

Funzionamento dell'algoritmo Radix Sort
Ordinamento in base alle cifre in centinaia di posti

Per l'iterazione finale, vogliamo ottenere la cifra piรน significativa. In questo caso sono i 100th posto per ciascuno dei numeri interi nell'elenco.

Passo 1) Dividi i numeri interi per 100... 415 diviso per 100 dร  4.

Passo 2) Modifica il risultato del passaggio 1 con 10. 4 mod 10 ci dร  di nuovo 4.

Passo 3) Seguire il passaggio 3 dell'iterazione precedente.

Funzionamento dell'algoritmo Radix Sort
Elenco dopo la terza iterazione

Come possiamo vedere, l'elenco รจ ora ordinato in ordine crescente. L'iterazione finale รจ stata completata e il processo di ordinamento รจ terminato.

Pseudocodice dell'algoritmo Radix Sort

Ecco lo pseudo-codice per l'algoritmo Radix Sort

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 per implementare l'ordinamento digitale

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

Produzione:

162 248 415 623 835

Python Programma per l'algoritmo di ordinamento radicale

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

Produzione:

[162,248,415,623,835]

Analisi della complessitร  di Radix Sort

Esistono due tipi di complessitร  da considerare: la complessitร  spaziale e la complessitร  temporale.

  • Complessitร  spaziale: O(n+b) dove n รจ la dimensione dell'array e b รจ la base considerata.
  • Complessitร  temporale: O(d*(n+b)) dove d รจ il numero di cifre dell'elemento piรน grande nell'array.

Complessitร  spaziale dell'ordinamento radicale

Due caratteristiche su cui concentrarsi per la complessitร  dello spazio

  • Numero di elementi nell'array, n.
  • La base per rappresentare gli elementi, b.

A volte questa base puรฒ essere maggiore della dimensione dell'array.

La complessitร  complessiva รจ quindi O(n+b).

Le seguenti proprietร  degli elementi nell'elenco possono rendere inefficiente lo spazio di ordinamento digitale:

  • Elementi con un gran numero di cifre.
  • La base degli elementi รจ grande, come i numeri a 64 bit.

Complessitร  temporale dell'ordinamento digitale

รˆ possibile utilizzare l'ordinamento del conteggio come una subroutine, poichรฉ richiederร  ogni iterazioneeO(n+b) tempo. Se esistono d iterazioni, il tempo di esecuzione totale diventa O(d*(n+b)). Qui, "O" indica la funzione di complessitร .

Linearitร  dell'ordinamento radicale

Radix Sort รจ lineare quando

  • d รจ costante, dove d รจ il numero di cifre dell'elemento piรน grande.
  • b non รจ piรน grande in larga misura rispetto a n.

Confronti di Radix Sort con altri algoritmi comparativi

Come abbiamo visto, la complessitร  del Radix sort si basa sulla dimensione di una parola o di un numero. Avrร  la stessa complessitร  per i casi medi e migliori. E questo รจ O(d*(n+b)). Inoltre, differisce in base alla tecnica di ordinamento che usi nel mezzo. Ad esempio, puoi usare counting sort o quick sort per l'algoritmo di ordinamento intermedio all'interno del Radix sort.

Applicazioni dell'algoritmo Radix Sort

Importanti applicazioni di Radix Sort sono:

  • Radix Sort puรฒ essere utilizzato come algoritmo di ricerca della posizione in cui vengono utilizzati ampi intervalli di valori.
  • Viene utilizzato nella costruzione di un array di suffissi nell'algoritmo DC3.
  • Viene utilizzato in una macchina sequenziale ad accesso casuale presente in un tipico computer in cui vengono codificati i record.

Riassumi questo post con: