Sunteți pe pagina 1din 3

1

ESTRUCTURA DE DATOS (ING.) UNIDAD 6. ORDENACION INTERNA M.C. ROSA MARIA MICHEL NAVA

6.2 ALGORITMOS DE ORDENAMIENTO POR DISTRIBUCION.

6.2.1 RADIX.

A este método también se le llama “ordenamiento de raíz”. Este ordenamiento se basa en los valores de los
dígitos reales en las representaciones de posiciones de los números que se ordenan. Por ejemplo, el número
235 en notación decimal se escribe con un 2 en la posición de centenas, un 3 en la posición de decenas y un
5 en la posición de unidades.

1. Tome cada número en el orden en el cual aparecen en el archivo y colóquelos en una de las diez
colas (0...9) dependiendo del valor del dígito que es procesado.
2. Empezando con la cola de los números con dígito 0 y terminando con la cola de números con dígito
9. Retorne los números al archivo original en el orden en el cual fueron colocados en la cola,
(empezar con el dígito menos significativo y concluir con el más significativo).

Reglas para ordenar:

El más grande de dos enteros de igual longitud se determina del modo siguiente:

1. Empezar en el dígito más significativo y avanzar por los dígitos menos significativos mientras coinciden
los dígitos correspondientes en los dos números.
2. El número con el dígito más grande en la primera posición en la cual los dígitos de los dos números no
coinciden es el mayor de los dos (por supuesto sí coinciden todos los dígitos de ambos números, son
iguales).

Características y análisis de eficiencia de este método:

1. Debido a que el ciclo for (k = 1; k <= m; k++) externo se recorre m veces (una para cada dígito) y el
ciclo interior n veces (una para cada elemento en el archivo) el ordenamiento es de aproximadamente
(m*n). Es decir, los requerimientos del tiempo para el método depende del número de dígitos (m) y el
número de elementos del archivo (n). El ordenamiento es de O(m*n).
2. Si las llaves son complejas (es decir, si casi cada número que puede ser una llave lo es en realidad) m se
aproxima a log n, por lo que (m*n) se aproxima a (n log n).
3. Si la cantidad de dígitos es grande, en ocasiones es más eficiente ordenar el archivo aplicando primero
el ordenamiento de raíz a los dígitos más significativos y después utilizando inserción simple sobre el
archivo ya reorganizado. En casos donde la mayoría de los registros del archivo tengan diferente
número de dígitos significativos, este proceso elimina pasos innecesarios en los dígitos menos
significativos.

Ventajas:

1. El ordenamiento es razonablemente eficiente si el número de dígitos en las llaves no es demasiado


grande.
2. Si las máquinas tienen la ventaja de ordenar los dígitos (sobre todo si están en binario) lo ejecutarían
con mucho mayor rapidez de lo que ejecutan una comparación de dos llaves completas.

Desventajas:

1. Se requiere conocer la cantidad de dígitos del valor máximo (para saber cuando el método ya acomodó
2
ESTRUCTURA DE DATOS (ING.) UNIDAD 6. ORDENACION INTERNA M.C. ROSA MARIA MICHEL NAVA

todos los elementos).


2. Se requiere de espacio para almacenar los punteros del frente y de la parte posterior de la cola, además
de un campo adicional en cada registro que se utiliza como puntero a la lista encadenada.

Suponiendo que se quiere ordenar n números, cada uno de ellos compuesto de k dígitos. El siguiente es un
ejemplo con n = 10 y k = 5 (número de dígitos por número).

73895
93754
82149
99046
04853
94171
54963
70471
80564
66496

Imaginando que estos dígitos forman parte de una matriz, podemos decir que a [i, j] es el j-ésimo del i-
ésimo elemento del conjunto. Es fácil, en una pasada, ordenar el conjunto de la llave de ordenación es un
solo dígito, por ejemplo el tercero de izquierda a derecha:

99046
82149
94171
70471
66496
80564
93754
73895
04853
54963

Para ordenar un conjunto de llaves completas, repetimos el proceso dígito por dígito, en cada pasada
separando los elementos según el valor del dígito respectivo, luego recolectándolos para formar una sola
cola, y realimentando el proceso con esos mismos datos. El conjunto completo queda finalmente ordenado
si los dígitos se van tomando de derecha a izquierda.

Como hay que realizar k pasadas y cada una de ellas toma tiempo O(N), el tiempo total es O(k N), que es
el tamaño del archivo de entrada (en bytes). Por lo tanto, la ordenación tomó un tiempo lineal en el tamaño
de los datos.

A continuación, se muestra el procedimiento que se sigue para este ordenamiento:

// Se define un arreglo de N registros o estructuras que contengan un campo de información y uno como
puntero para almacenar la dirección del nodo siguiente.
// FRENTE y POSTERIOR son arreglos auxiliares
3
ESTRUCTURA DE DATOS (ING.) UNIDAD 6. ORDENACION INTERNA M.C. ROSA MARIA MICHEL NAVA

// X es el arreglo original con los valores a ordenar


// EXP, PRIMERO, I, J, K, P, Q y Y son variables de tipo entero

RADIX( X[ ], N)
{
Para I desde 0 y mientras I < N–1 Hacer{
NODO[ I ]. INFO = X[ I ] y NODO[ I ]. SIG = I + 1;
}
Hacer NODO[ N–1 ]. INFO = X[ N–1 ], NODO[ N–1 ]. SIG = -1 y PRIMERO = 0;
Para K desde 1 y Mientras K sea menor o igual que el total de dígitos Hacer {
Para I desde 0 hasta 9 Hacer {
FRENTE[ I ] = -1 y POSTERIOR[ I ] = -1;
}
EXP = Elevar 10 a la K–1;
Repetir Mientras (PRIMERO != -1) {
Hacer P = PRIMERO, PRIMERO = NODO[ PRIMERO ]. SIG,
Y = NODO[ P ]. INFO,
J = Residuo de dividir ((Y entre EXP) entre 10) y Q = POSTERIOR[ J ];
Si (Q = -1) entonces Hacer FRENTE[ J ] = P;
De lo contrario Hacer NODO[ Q ]. SIG = P;
Hacer POSTERIOR[ J ] = P;
}
Para J desde 0 y Mientras J < 10 y FRENTE[ J ] = -1 Hacer Incrementar J;
Hacer PRIMERO = FRENTE[ J ];
Repetir Mientras (J <= 9){
Para I desde J+1 y Mientras I < 10 y FRENTE[ I ] = -1 Hacer
Incrementar I;
Si (I <= 9) entonces {
Hacer P=I y NODO[ POSTERIOR[ J ] ]. SIG = FRENTE[ I ];
}
Hacer J = I;
}
Si (POSTERIOR[P] != -1) Hacer NODO[ POSTERIOR[ P ] ]. SIG = -1;
}
Para I desde 0 hasta N–1 Hacer {
X[ I ]= NODO[ PRIMERO ]. INFO y
PRIMERO = NODO[ PRIMERO ]. SIG;
}
}

S-ar putea să vă placă și