sort pseudocódigo prueba mejor funciona flujo escritorio diagrama cormen como codigo caso algorithm sorting radix-sort

algorithm - pseudocódigo - radix sort prueba de escritorio



¿Cómo funciona Radix Sort? (3)

En matemáticas, radix significa base, donde decimal sería base 10. Imagine que tiene números, algunos de los cuales tienen más de un dígito, como

5, 213, 55, 21, 2334, 31, 20, 430

Para simplificar, supongamos que quiere usar la base decimal (= 10) para ordenar. Entonces comenzarías separando los números por unidades y luego juntándolos nuevamente; luego separarías los números por decenas y luego los juntarías de nuevo; luego por cientos y así sucesivamente hasta que todos los números estén ordenados. Cada vez que bucle, simplemente lea la lista de izquierda a derecha. También puedes imaginar que estás separando los números en cubos. Aquí hay una ilustración usando 5, 213, 55, 21, 2334, 31, 20, 430

Separado por unidades:

  • ceros: 20, 430

  • unos: 21, 31

  • dos:

  • tres en tres: 213

  • Cuatro patas: 2334

  • cinco: 5, 55

    De vuelta juntos: 20, 430, 21, 31, 213, 2334, 5, 55

Para volver a armarlos, primero lea el cubo de zeroes , luego ones balde, y así sucesivamente, hasta que lea el cucharón de nines .

Separados por decenas:

  • ceros: 05

  • unos: 213

  • Dos: 20, 21

  • tres: 430, 31, 2334,

  • Cuatro:

  • cinco: 55

    De vuelta juntos: 5, 213, 20, 21, 430, 31, 2334, 55

Separados por cientos:

  • ceros: 005, 020, 021, 031, 055

  • unos:

  • Dos: 213

  • tres: 2334

  • Cuatro patas: 430

  • cinco:

    De vuelta juntos: 5, 20, 21, 31, 55, 213, 2334, 430

Separados por miles:

  • ceros: 0005, 0020, 0021, 0031, 0055, 0213, 0430

  • unos:

  • Dos: 2334

  • tres:

  • Cuatro:

  • cinco:

    De vuelta juntos: 5, 20, 21, 31, 55, 213, 430, 2334

Ya has terminado. Vi un buen código para esto en Geekviewpoint tanto en Java como en python

No sé por qué es tan difícil para mí entenderlo. He revisado las páginas de la wiki y el pseudocódigo (así como el código real) tratando de comprender cómo funcionan los algoritmos de ordenación de radix (con respecto a los segmentos).

¿Estoy buscando algo equivocado aquí? ¿Debo buscar en el tipo de cubo, tal vez? ¿Puede alguien darme una versión simplificada de cómo funciona? Como referencia, aquí hay un bloque de código que supuestamente realiza una ordenación de radix:

// Sort ''size'' number of integers starting at ''input'' according to the ''digit''th digit // For the parameter ''digit'', 0 denotes the least significant digit and increases as significance does void radixSort(int* input, int size, int digit) { if (size == 0) return; int[10] buckets; // assuming decimal numbers // Sort the array in place while keeping track of bucket starting indices. // If bucket[i] is meant to be empty (no numbers with i at the specified digit), // then let bucket[i+1] = bucket[i] for (int i = 0; i < 10; ++i) { radixSort(input + buckets[i], buckets[i+1] - buckets[i], digit+1); } }

Y también he analizado soluciones no recursivas:

void radixsort(int *a, int arraySize) { int i, bucket[sortsize], maxVal = 0, digitPosition =1 ; for(i = 0; i < arraySize; i++) { if(a[i] > maxVal) maxVal = a[i]; } int pass = 1; while(maxVal/digitPosition > 0) { // reset counter int digitCount[10] = {0}; // count pos-th digits (keys) for(i = 0; i < arraySize; i++) digitCount[a[i]/digitPosition%10]++; // accumulated count for(i = 1; i < 10; i++) digitCount[i] += digitCount[i-1]; // To keep the order, start from back side for(i = arraySize - 1; i >= 0; i--) bucket[--digitCount[a[i]/digitPosition%10]] = a[i]; for(i = 0; i < arraySize; i++) a[i] = bucket[i]; cout << "pass #" << pass++ << ": "; digitPosition *= 10; } }

Específicamente, esta línea me está dando problemas. Intenté recorrerlo con lápiz y papel, pero todavía no puedo entender lo que está haciendo:

// To keep the order, start from back side for(i = arraySize - 1; i >= 0; i--) bucket[--digitCount[a[i]/digitPosition%10]] = a[i];


Este es el flujo básico de quicksort.

Para el 1er pase: ordenamos el conjunto en función del dígito menos significativo (lugar 1) usando el tipo de conteo. Observe que 435 está por debajo de 835, porque 435 ocurrió por debajo de 835 en la lista original.

Para el segundo pase: ordenamos el conjunto sobre la base del siguiente dígito (lugar 10) usando el tipo de conteo. Observe que aquí 608 está por debajo de 704, porque 608 ocurrió por debajo de 704 en la lista anterior, y de manera similar por (835, 435) y (751, 453).

Para el tercer pase: ordenamos el conjunto sobre la base del dígito más significativo (lugar 100) usando el tipo de conteo. Observe que aquí 435 está por debajo de 453, porque 435 ocurrió por debajo de 453 en la lista anterior, y de manera similar por (608, 690) y (704, 751).

Para más detalles , puede consultar este blog en codingeek y tener una comprensión clara .


Piensa en un mazo de cartas. Primero lo clasifica por palo en cuatro montones. Luego colocas esas cuatro pilas una encima de la otra y ahora clasificas en 13 pilas según el rango. Ponlos juntos y ahora tienes un mazo ordenado.