Anda di halaman 1dari 23

1

ESTRUCTURA DE DATOS (ING.)

UNIDAD 5. METODOS DE ORDENAMIENTO

DRA. ROSA MARIA MICHEL NAVA

UNIDAD 5.
METODOS DE ORDENAMIENTO
COMPETENCIA ESPECIFICA DE LA UNIDAD.

Aplicar el mtodo de ordenamiento pertinente


en la solucin de un problema real.

5.1 ALGORITMOS DE ORDENAMIENTO INTERNO


5.1.1 BURBUJA
El mtodo de intercambio directo, conocido tambin con el nombre de burbuja, es uno de los ms
utilizados, por su fcil comprensin y programacin, pero tambin es probablemente el mtodo ms
ineficiente.
Este mtodo puede trabajar de dos maneras diferentes. Llevando los elementos ms pequeos hacia la parte
izquierda del arreglo o bien llevando los elementos ms grandes hacia la parte derecha del mismo.
La idea bsica de este algoritmo consiste en comparar pares de elementos adyacentes e intercambiarlos
entre s hasta que todos se encuentren ordenados. Se realizan (n 1) pasadas, transportando en cada una de
las mismas el menor o mayor elemento (segn sea el caso) a su posicin ideal. Al final de las (n 1)
pasadas los elementos del arreglo estarn ordenados.
Suponiendo que se desea ordenar el siguiente arreglo, transportando en cada pasada el menor elemento
hacia la parte izquierda del arreglo:

15

67

16

44

27

12

35

Luego de cada pasada, el arreglo queda de la siguiente manera:


Primera pasada:
Segunda pasada:
Tercer pasada:
Cuarta pasada:
Quinta pasada:
Sexta pasada:
Sptima pasada:

8
8
8
8
8
8
8

15
12
12
12
12
12
12

67
15
15
15
15
15
15

12
67
16
16
16
16
16

16
16
67
27
27
27
27

44
27
27
67
35
35
35

27
44
35
35
67
44
44

35
35
44
44
44
67
67

El procedimiento para ordenar los elementos del arreglo transportando los elementos ms pequeos hacia la
izquierda es el siguiente:

2
ESTRUCTURA DE DATOS (ING.)

UNIDAD 5. METODOS DE ORDENAMIENTO

DRA. ROSA MARIA MICHEL NAVA

BURBUJA (A[ ], N) {
Repetir con I desde 2 hasta N {
Repetir con J desde N hasta I {
Si (A[ J 1 ] > A[ J ]) entonces {
Hacer AUX = A[ J 1 ], A[ J 1 ]= A[ J ] y A[ J ] = AUX;
}
}
}
}

Por otro lado, si se desea ordenar el siguiente arreglo, transportando en cada pasada el mayor elemento
hacia la parte derecha del arreglo:
15

67

16

44

27

12

35

Luego de cada pasada, el arreglo queda de la siguiente manera:


Primera pasada:
Segunda pasada:
Tercer pasada:
Cuarta pasada:
Quinta pasada:
Sexta pasada:
Sptima pasada:

15
8
8
8
8
8
8

8
15
15
15
12
12
12

16
16
16
12
15
15
15

44
27
12
16
16
16
16

27
12
27
27
27
27
27

12
35
35
35
35
35
35

35
44
44
44
44
44
44

67
67
67
67
67
67
67

El procedimiento para ordenar los elementos del arreglo transportando los elementos ms grandes hacia la
derecha es el siguiente:
BURBUJA (A[ ], N) {
Repetir con I desde 1 hasta N 1 {
Repetir con J desde 1 hasta N I {
Si (A[ J ] > A[ J + 1 ]) entonces {
Hacer AUX = A[ J ], A[ J ] = A[ J + 1 ] y A[ J + 1 ] = AUX
}
}
}
}
Anlisis de eficiencia del mtodo de ordenamiento burbuja
El nmero de comparaciones es fcilmente contabilizable. En la primera pasada se realizan (n 1)
comparaciones, en la segunda pasada (n 2), en la tercera (n 3) y as sucesivamente hasta llegar a 2 y 1
comparaciones entre claves, siendo n el nmero de elementos del arreglo.

3
ESTRUCTURA DE DATOS (ING.)

UNIDAD 5. METODOS DE ORDENAMIENTO

DRA. ROSA MARIA MICHEL NAVA

Respecto al nmero de movimientos, stos dependen de si el arreglo est ordenado, desordenado o en orden
inverso. Los movimientos para cada uno de estos casos son:
Mmed = 0.75 * (n2 n)

Mmn = 0

Mmx = 1.5 * (n2 n)

Tiempo de ejecucin de la burbuja

Para el mejor caso (que el vector est ordenado), O(n).


Para el peor caso (que el vector est ordenado en sentido inverso), n (n 1) / 2
= (n 1)2
Para el caso promedio (cuando el vector est desordenado aleatoriamente), O(n2).

= (n2 n) / 2

5.1.2 QUICKSORT
El mtodo de ordenacin quicksort es actualmente el ms eficiente y veloz de los mtodos de ordenacin
interna. Es tambin conocido con el nombre de mtodo rpido y de ordenacin por particin. Este mtodo
es una mejora sustancial del mtodo de intercambio directo y recibe el nombre de Quicksort (rpido) por la
velocidad con que ordena los elementos del arreglo. Su autor C. A. Hoare lo bautiz as.
La idea central de este algoritmo consiste en lo siguiente:
1. Se toma un elemento X de una posicin cualquiera del arreglo (conocido como pivote).
2. Se trata de ubicar a X en la posicin correcta del arreglo, de tal forma que todos los elementos que se
encuentren a su izquierda sean menores o iguales a X y todos los elementos que se encuentren a su
derecha sean mayores o iguales a X.
3. Se repiten los pasos anteriores pero ahora para los conjuntos de datos que se encuentran a la izquierda
y a la derecha de la posicin correcta de X en el arreglo.
4. El proceso termina cuando todos los elementos se encuentran en su posicin correcta en el arreglo.
Para entender mejor el procedimiento, se supone que se desea ordenar los elementos del siguiente arreglo:

15

67

16

44

27

12

35

Se selecciona A[ 1 ], por lo tanto X = 15


PRIMER PASADA:
Recorrido de derecha a izquierda:
12

67

16

44

27

15

35

67

35

Recorrido de izquierda a derecha:


12

15

16

44

27

4
ESTRUCTURA DE DATOS (ING.)

UNIDAD 5. METODOS DE ORDENAMIENTO

DRA. ROSA MARIA MICHEL NAVA

SEGUNDA PASADA:
Recorrido de derecha a izquierda:
12

15

16

44

27

67

35

Como el recorrido de izquierda a derecha debera iniciarse en la misma posicin donde se encuentra el
elemento X, el proceso se termina ya que el elemento X se encuentra en la posicin correcta:
12

15

16

44

27

1er. Conjunto

67

35

2do. Conjunto

Despus de haber ubicado al elemento X en su lugar, se procede a ordenar el resto del arreglo, quedando de
la siguiente manera:
12

15

16

44

27

67

35

12

15

16

35

27

44

67

12

15

16

27

35

44

67

12

15

16

27

35

44

67

El algoritmo de ordenacin por el mtodo quicksort en su versin iterativa es el siguiente:


// TOP, INI, FIN y POS son variables de tipo entero
// PILAMENOR y PILAMAYOR son arreglos unidimensionales
QUICKSORT(A[ ], N){
TOP = 1, PILAMENOR[TOP]=1 y PILAMAYOR[TOP]=N;
Repetir Mientras (TOP > 0){
Hacer INI = PILAMENOR[TOP], FIN=PILAMAYOR[TOP] y TOP=TOP 1;
Llamar al algoritmo ORDENA con INI, FIN y POS;
Si (INI < POS-1) entonces{
Hacer TOP = TOP + 1, PILAMENOR[TOP]=INI y PILAMAYOR[TOP]=POS 1;
}
Si (FIN > POS +1) entonces{
Hacer TOP = TOP + 1, PILAMENOR[TOP]=POS+1 y PILAMAYOR[TOP]= FIN;
}
}
}

5
ESTRUCTURA DE DATOS (ING.)

UNIDAD 5. METODOS DE ORDENAMIENTO

DRA. ROSA MARIA MICHEL NAVA

// INI y FIN representan las posiciones de los extremos izquierdo y derecho respectivamente, del conjunto
de elementos a evaluar. POS es una variable donde se almacenar el resultado de este algoritmo
ORDENA (INI, FIN, POS){
Hacer IZQ=INI, DER=FIN, POS=INI y BAND=VERDADERO;
Repetir Mientras (BAND=VERDADERO){
Repetir Mientras (A[POS] <= A[DER] y POS != DER){
DER = DER 1;
}
Si (POS = DER) entonces Hacer BAND=FALSO;
Si no {
Hacer AUX=A[POS], A[POS]=A[DER], A[DER]=AUX y POS=DER;
Repetir Mientras (A[POS] >= A[IZQ] y POS != IZQ){
IZQ=IZQ + 1;
}
Si (POS = IZQ) entonces Hacer BAND=FALSO;
Si no {
Hacer AUX=A[POS], A[POS]=A[IZQ], A[IZQ]=AUX y POS=IZQ;
}
}
}
}
El algoritmo de ordenacin por el mtodo quicksort en su aplicacin recursiva es el siguiente:
QUICKSORT( A[ ], N ) {
Llamar al algoritmo ORDENAR con 0 y (N 1);
}
ORDENAR ( IZQ, DER ) {
Hacer I = IZQ, J = DER y V = A[ ( I + J ) / 2 ];
Repetir {
Repetir mientras ( A[ I ] < V ) {
Hacer I = I + 1;
}
Repetir mientras ( A[ J ] > V) {
Hacer J = J 1;
}
Si I <= J entonces {
Hacer AUX =A[ I ], A[ I ] = A[ J ], A[ J ] = AUX, I = I + 1 y J = J 1;
}
}Mientras ( I <= J )
a) Si ( IZQ < J ) entonces Regresar a Ordenar con IZQ y J;
// Llamada recursiva
b) Si (I < DER) entonces Regresar a Ordenar con I y DER;
//Llamada recursiva
}

6
ESTRUCTURA DE DATOS (ING.)

UNIDAD 5. METODOS DE ORDENAMIENTO

DRA. ROSA MARIA MICHEL NAVA

Anlisis de eficiencia del mtodo de ordenamiento quicksort


Si se escoge en cada pasada el elemento que ocupa la posicin central del conjunto de datos a analizar, el
nmero de pasada necesarias para ordenarlo es del orden de log n. Respecto al nmero de comparaciones,
si el tamao del arreglo es una potencia de 2, en la primera pasada realizar (n 1) comparaciones, en la
segunda pasada realizar (n 1) / 2 comparaciones pero en dos conjuntos diferentes, en la tercera pasada
realizar (n 1) / 4 comparaciones pero en cuatro conjuntos diferentes y as sucesivamente.
Como conclusin se puede afirmar que el tiempo promedio de ejecucin del algoritmo es proporcional a (n
* log n), O(n * log n). En el peor caso el tiempo de ejecucin es proporcional a n2, O(n2).
5.1.3 SHELLSORT
El mtodo de shell es una versin mejorada del mtodo de insercin directa. Recibe ese nombre en honor a
su autor Donald L. Shell quien lo propuso en 1959. Este mtodo tambin se conoce con el nombre de
insercin con incrementos decrecientes.
En el mtodo de ordenacin por insercin directa (burbuja) cada elemento se compara para su ubicacin
correcta en el arreglo, con los elementos que se encuentran en la parte izquierda del mismo. Si el elemento
a insertar es ms pequeo que el grupo de elementos que se encuentran a su izquierda, es necesario efectuar
entonces varias comparaciones antes de su ubicacin.
Shell propone que las comparaciones entre elementos se efecten con saltos de mayor tamao pero con
incrementos decrecientes, as, los elementos quedarn ordenados en el arreglo ms rpidamente.
Suponiendo que se desea ordenar el siguiente arreglo utilizando el mtodo de Shell, el cual funciona de la
siguiente manera:
15

67

16

44

27

12

35

56

21

13

28

60

36

10

28

60

36

10

PRIMER PASADA:
Se dividen los elementos en 8 grupos y se comparan por parejas:
15

67

16

44

27

12

35

56

21

13

7
ESTRUCTURA DE DATOS (ING.)

UNIDAD 5. METODOS DE ORDENAMIENTO

DRA. ROSA MARIA MICHEL NAVA

Despus de esta pasada, los elementos del arreglo quedan de la siguiente manera:
15

21

16

44

27

10

56

67

13

28

60

36

12

35

28

60

36

12

35

SEGUNDA PASADA:
Se dividen los elementos en 4 grupos y se comparan por parejas:
15

21

16

44

27

10

56

67

13

Despus de esta pasada, los elementos del arreglo quedan de la siguiente manera:
15

21

10

44

27

16

56

36

12

28

60

67

13

35

28

60

67

13

35

TERCERA PASADA:
Se dividen los elementos en 2 grupos y se comparan por parejas:
15

21

10

44

27

16

56

36

12

Despus de esta pasada, los elementos del arreglo quedan de la siguiente manera:
7

10

16

12

21

13

27

15

28

44

35

56

36

60

67

56

36

60

67

60

67

CUARTA PASADA:
Se dividen los elementos en un solo grupo y se comparan por parejas:
7

10

16

12

21

13

27

15

28

44

35

Despus de esta pasada, los elementos del arreglo quedan de la siguiente manera:
7

10

12

13

15

16

21

27

El procedimiento del mtodo de Shell es el siguiente:

28

35

36

44

56

8
ESTRUCTURA DE DATOS (ING.)

UNIDAD 5. METODOS DE ORDENAMIENTO

DRA. ROSA MARIA MICHEL NAVA

SHELL (A[ ], N) {
Hacer INT = N + 1;
Repetir mientras (INT > 1) {
Hacer INT = Parte entera de INT / 2 y BAND = VERDADERO;
Repetir mientras (BAND = VERDADERO) {
Hacer BAND = FALSO y I = 1;
Repetir mientras ((I + INT ) < = N ) {
Si (A[ I ] > A[ I + INT ]) entonces {
Hacer AUX = A [ I ], A[ I ] = A[ I + INT ],
A[ I + INT ] = AUX y BAND= VERDADERO;
}
Hacer I = I + 1;
}
}
}
}
Anlisis de eficiencia del mtodo de ordenamiento shell
El anlisis de eficiencia del mtodo de Shell es un problema muy complicado y an no resuelto. No se ha
podido establecer hasta el momento la mejor secuencia de incrementos cuando n es grande. En 1969 Pratt
descubri que el tiempo de ejecucin del algoritmo es del orden de O(n * (log n)2).
5.1.4 RADIX
A este mtodo tambin se le llama ordenamiento de raz. Este ordenamiento se basa en los valores de los
dgitos reales en las representaciones de posiciones de los nmeros que se ordenan. Por ejemplo, el nmero
235 en notacin decimal se escribe con un 2 en la posicin de centenas, un 3 en la posicin de decenas y un
5 en la posicin de unidades.
1. Tome cada nmero en el orden en el cual aparecen en el archivo y colquelos en una de las diez
colas (0...9) dependiendo del valor del dgito que es procesado.
2. Empezando con la cola de los nmeros con dgito 0 y terminando con la cola de nmeros con dgito
9. Retorne los nmeros al archivo original en el orden en el cual fueron colocados en la cola,
(empezar con el dgito menos significativo y concluir con el ms significativo).
Reglas para ordenar
El ms grande de dos enteros de igual longitud se determina del modo siguiente:
1. Empezar en el dgito ms significativo y avanzar por los dgitos menos significativos mientras
coinciden los dgitos correspondientes en los dos nmeros.
2. El nmero con el dgito ms grande en la primera posicin en la cual los dgitos de los dos nmeros no
coinciden es el mayor de los dos (por supuesto s coinciden todos los dgitos de ambos nmeros, son
iguales).

9
ESTRUCTURA DE DATOS (ING.)

UNIDAD 5. METODOS DE ORDENAMIENTO

DRA. ROSA MARIA MICHEL NAVA

Caractersticas y anlisis de eficiencia de este mtodo


1. Debido a que el ciclo for (k = 1; k <= m; k++) externo se recorre m veces (una para cada dgito) 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 mtodo depende del nmero de dgitos (m) y el
nmero de elementos del archivo (n). El ordenamiento es de O(m*n).
2. Si las llaves son complejas (es decir, si casi cada nmero 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 dgitos es grande, en ocasiones es ms eficiente ordenar el archivo aplicando primero
el ordenamiento de raz a los dgitos ms significativos y despus utilizando insercin simple sobre el
archivo ya reorganizado. En casos donde la mayora de los registros del archivo tengan diferente
nmero de dgitos significativos, este proceso elimina pasos innecesarios en los dgitos menos
significativos.
Ventajas
1. El ordenamiento es razonablemente eficiente si el nmero de dgitos en las llaves no es demasiado
grande.
2. Si las mquinas tienen la ventaja de ordenar los dgitos (sobre todo si estn en binario) lo ejecutaran
con mucho mayor rapidez de lo que ejecutan una comparacin de dos llaves completas.
Desventajas
1. Se requiere conocer la cantidad de dgitos del valor mximo (para saber cuando el mtodo ya acomod
todos los elementos).
2. Se requiere de espacio para almacenar los punteros del frente y de la parte posterior de la cola, adems
de un campo adicional en cada registro que se utiliza como puntero a la lista encadenada.
Suponiendo que se quiere ordenar n nmeros, cada uno de ellos compuesto de k dgitos. El siguiente es un
ejemplo con n = 10 y k = 5 (nmero de dgitos por nmero).

73895
93754
82149
99046
04853
94171
54963
70471
80564
66496
Imaginando que estos dgitos forman parte de una matriz, podemos decir que a [i, j] es el j-simo del isimo elemento del conjunto. Es fcil, en una pasada, ordenar el conjunto de la llave de ordenacin es un

10
ESTRUCTURA DE DATOS (ING.)

UNIDAD 5. METODOS DE ORDENAMIENTO

DRA. ROSA MARIA MICHEL NAVA

solo dgito, 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 dgito por dgito, en cada pasada
separando los elementos segn el valor del dgito respectivo, luego recolectndolos para formar una sola
cola, y realimentando el proceso con esos mismos datos. El conjunto completo queda finalmente ordenado
si los dgitos 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 tamao del archivo de entrada (en bytes). Por lo tanto, la ordenacin tom un tiempo lineal en el tamao
de los datos.
A continuacin, se muestra el procedimiento que se sigue para este ordenamiento:
// Se define un arreglo de N registros o estructuras que contengan un campo de informacin y uno como
puntero para almacenar la direccin del nodo siguiente.
// FRENTE y POSTERIOR son arreglos auxiliares
// X es el arreglo original con los valores a ordenar
// EXP, PRIMERO, I, J, K, P, Q y Y son variables de tipo entero

11
ESTRUCTURA DE DATOS (ING.)

UNIDAD 5. METODOS DE ORDENAMIENTO

DRA. ROSA MARIA MICHEL NAVA

RADIX( X[ ], N)
{
Para I desde 0 y mientras I < N1 Hacer{
NODO[ I ]. INFO = X[ I ] y NODO[ I ]. SIG = I + 1;
}
Hacer NODO[ N1 ]. INFO = X[ N1 ], NODO[ N1 ]. SIG = -1 y PRIMERO = 0;
Para K desde 1 y Mientras K sea menor o igual que el total de dgitos Hacer {
Para I desde 0 hasta 9 Hacer {
FRENTE[ I ] = -1 y POSTERIOR[ I ] = -1;
}
EXP = Elevar 10 a la K1;
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 N1 Hacer {
X[ I ]= NODO[ PRIMERO ]. INFO y
PRIMERO = NODO[ PRIMERO ]. SIG;
}
}
5.2 ALGORITMOS DE ORDENAMIENTO EXTERNO
La ordenacin de archivos se lleva a cabo cuando el volumen de los datos a tratar es demasiado grande y
los mismos no caben en la memoria principal de la computadora. Al ocurrir esta situacin no pueden
aplicarse los mtodos de ordenacin interna.
Por ordenacin de archivos se entiende, la ordenacin o clasificacin de stos, ascendente o
descendentemente, de acuerdo con un campo determinado al que se denominar campo clave. La principal

12
ESTRUCTURA DE DATOS (ING.)

UNIDAD 5. METODOS DE ORDENAMIENTO

DRA. ROSA MARIA MICHEL NAVA

desventaja de esta ordenacin es el tiempo de ejecucin, debido a las sucesivas operaciones de entrada y
salida.
5.2.1 INTERCALACION
Al mtodo de Intercalacin tambin se le conoce como Merge (Mezcla). Consiste en la unin o fusin de
dos o ms archivos, ordenados de acuerdo con un determinado campo clave, en un solo archivo. Por
ejemplo, suponiendo que se tienen dos archivos, F1 y F2, ordenados de acuerdo a un campo clave:
F1:

06

09

18

20

35

F2:

10

16

25

28

66

82

87

Debe producirse un archivo F3 ordenado, como resultado de la mezcla de F1 y F2. Slo pueden ser
accesadas directamente dos claves, la primera del archivo F1 y la segunda del archivo F2. Las
comparaciones que se realizan para producir el archivo F3 son las siguientes:
(06 > 10)

s se cumple la condicin
Se escribe 06 en el archivo de salida F3 y se vuelve a leer otra clave de F1 (09).

(09 > 10)

s se cumple la condicin
Se escribe 09 en el archivo de salida F3 y se vuelve a leer otra clave de F1 (18).

(18 > 10)

no se cumple la condicin
Se escribe 10 en el archivo de salida F3 y se vuelve a leer otra clave de F2 (16).

El estado de los archivos F1, F2 y F3 es hasta el momento el siguiente:

F1:

06

09

18

20

35

F2:

10

16

25

28

66

F3:

06

09

10

82

87

El proceso contina hasta que en uno u otro archivo se detecte el fin de archivo, en tal caso slo se tendrn
que transcribir las claves del archivo no vaco al archivo de salida F3. El resultado final de la intercalacin
entre los archivos F1 y F2, es el que se muestra a continuacin:
F3:

06

09

10

16

18

20

25

28

35

66

El algoritmo correspondiente para la intercalacin de archivos, es el siguiente:

82

87

13
ESTRUCTURA DE DATOS (ING.)

UNIDAD 5. METODOS DE ORDENAMIENTO

DRA. ROSA MARIA MICHEL NAVA

Algoritmo Intercalacin
//El algoritmo intercala los elementos de dos archivos ya ordenados F1 y F2 y almacena el resultado en el
archivo F3
//r1 y r2 son variables de tipo entero
Intercalacin ( F1, F2, F3)
{
Abrir los archivos F1 y F2 para lectura
Abrir el archivo F3 para escritura
Leer r1 de F1 y r2 de F2
//r1 y r2 son las primeras claves de F1 y F2, respectivamente
Repetir Mientras (no sea fin de archivo de F1 y no sea fin de archivo de F2)
{
Si (r1 < r2) entonces
{
Escribir r1 en F3;
Leer r1 de F1;
}
Sino
{
Escribir r2 en F3;
Leer r2 de F2;
}
}
Repetir Mientras (no sea fin de archivo de F1 o no sea fin de archivo de F2)
{
Si (fin de archivo de F1) entonces
{
Escribir r2 en F3;
Repetir Mientras (no sea el fin de archivo de F2)
{
Leer r2 de F2;
Escribir r2 en F3;
}
}
Sino
{
Escribir r1 en F3;
Repetir Mientras (no sea el fin de archivo de F1)
{
Leer r1 de F1;
Escribir r1 en F3;
}
}
}

14
ESTRUCTURA DE DATOS (ING.)

UNIDAD 5. METODOS DE ORDENAMIENTO

DRA. ROSA MARIA MICHEL NAVA

}
Anlisis de eficiencia del ordenamiento de intercalacin
Existe una deficiencia de este procedimiento, no es muy prctico para archivos pequeos. El tiempo
requerido para el procedimiento es O(n*log(n)).
5.2.2 MEZCLA DIRECTA
El mtodo de ordenacin por intercalacin directa (tambin conocido como mezcla directa) es
probablemente el ms utilizado por su fcil comprensin.
La idea central de este algoritmo consiste en la realizacin sucesiva de una particin y una fusin que
produce secuencias ordenadas de longitud cada vez mayor. En la primera pasada la particin es de longitud
1 y la fusin o mezcla produce secuencias ordenadas de longitud 2. En la segunda pasada la particin es de
longitud 2 y la fusin o mezcla produce secuencias ordenadas de longitud 4. Este proceso se repite hasta
que la longitud de la secuencia para la particin sea mayor o igual que el nmero de elementos del archivo
original.
Por ejemplo, suponiendo que se desea ordenar las claves del archivo F utilizando el mtodo de mezcla
directa:
F:

25
64

33
77

15
29

18
36

21
11

07

12

36

84

90

19

38

19

38

Los pasos que se realizan son los siguientes:


PRIMERA PASADA:
Particin en secuencias de longitud 1.
F1:
25
15
21
12
84
F2:
33
18
7
36
90
Fusin en secuencia de longitud 2.

19
38

40
22

64
77

29
36

11

F:

21
36

12
11

36

84

90

90
38

22
64

40
77

29
11

36

25
22

33
40

15
64

18
77

7
29

SEGUNDA PASADA:
Particin en secuencias de longitud 2.
F1:
F2:

25
15

33
18

7
12

21
36

Fusin en secuencias de longitud 4.

84
19

40

22

15
ESTRUCTURA DE DATOS (ING.)

F:

15
22

18
40

25
64

UNIDAD 5. METODOS DE ORDENAMIENTO

33
77

7
11

DRA. ROSA MARIA MICHEL NAVA

12
29

21
36

36

19

38

84

19
22

38
40

84
64

90
77

11

29

36

21
36

25

33

36

19

22

38

21
64

25
77

33
84

36
90

11

29

36

19
36

21

22

25

33

36

19

21

22

25

33

18
90

19

21

22

25

90

TERCERA PASADA:
Particin en secuencias de longitud 4.
F1:
F2:

15
7

18
12

25
21

33
36

Fusin en secuencias de longitud 8.


F:

7
84

12
90

15
11

18
29

40

64

77

38

40

64

77

36

38

40

64

77

29

33

36

36

38

CUARTA PASADA:
Particin en secuencias de longitud 8.
F1:
F2:

7
19

12
22

15
38

18
40

Fusin en secuencias de longitud 16.


F:

7
84

12
90

15
11

18
29

QUINTA PASADA:
Particin en secuencias de longitud 16.
F1:
F2:

7
84
11

12
90
29

15

18

36

Fusin en secuencias de longitud 32.


F:

7
40

11
64

12
77

15
84

El algoritmo de ordenacin por el mtodo Mezcla directa es el siguiente:


Algoritmo mezcla directa
// El algoritmo ordena los elementos del archivo F, utiliza dos archivos auxiliares F1 y F2. N es el nmero
de elementos del archivo F

16
ESTRUCTURA DE DATOS (ING.)

UNIDAD 5. METODOS DE ORDENAMIENTO

// part es una variable de tipo entero


Mezcla_directa ( F, F1, F2, N)
{
Hacer part = 1;
Repetir Mientras (part < n)
{
Llamar al algoritmo Particiona con F, F1, F2 y part;
Llamar al algoritmo Fusiona con F, F1, F2 y part;
Hacer part = part * 2;
}
}
Algoritmo particiona
// El algoritmo particiona el archivo F en dos archivos auxiliares, F1 y F2
// part es la longitud de la particin que se va a realizar
// k, q y r son variables de tipo entero
Particiona (F, F1, F2, part;)
{
Abrir el archivo F para lectura;
Abrir los archivos F1 y F2 para escritura;
Repetir Mientras (no sea el fin de archivo de F)
{
Hacer k = 0;
Repetir Mientras (k< part y no sea el fin de archivo de F)
{
Leer r de F;
Escribir r en F1;
Hacer k = k + 1;
}
Hacer q = 0;
Repetir Mientras (q < part y no sea el fin de archivo de F)
{
Leer r de F;
Escribir r en F2;
Hacer q = q + 1;
}
}
}
Algoritmo fusiona
// El algoritmo fusiona los archivos F1 y F2 en el archivo F
// part es la longitud de la particin que se realiz
// r1, r2, k y q son variables de tipo entero

DRA. ROSA MARIA MICHEL NAVA

17
ESTRUCTURA DE DATOS (ING.)

UNIDAD 5. METODOS DE ORDENAMIENTO

DRA. ROSA MARIA MICHEL NAVA

// b1 y b2 son variables de tipo booleano


Fusiona (F, F1, F2, part)
{
Abrir el archivo F para escritura
Abrir los archivos F1 y F2 para lectura
Hacer b1 = verdadero y b2 = verdadero;
Si (no es el fin de archivo de F1) entonces
{
Leer r1 de F1;
Hacer b1 = falso;
}
Si (no es el fin de archivo de F2) entonces
{
Leer r2 de F2;
Hacer b2 = falso;
}
Repetir Mientras ((no sea el fin de archivo de F1 o b1 = falso) y
(no sea el fin de archivo de F2 o b2 = falso))
{
Hacer k = 0; y q = 0;
Repetir Mientras (( k < part y b1 = falso) y (q < part y b2 = falso))
{
Si ( r1 <= r2) entonces
{
Escribir r1 en F;
Hacer b1 = verdadero; y k = k + 1;
Si (no es el fin de archivo de F1) entonces
{
Leer r1 de F1;
Hacer b1 = falso;
}
}
Sino
{
Escribir r2 en F;
Hacer b2 = verdadero; y q = q + 1;
Si (no es el fin de archivo de F2) entonces
{
Leer r2 de F2;
Hacer b2 = falso;
}
}
}
Si ( k < part) entonces
{
Repetir Mientras (k < part y b1 = falso)

18
ESTRUCTURA DE DATOS (ING.)

UNIDAD 5. METODOS DE ORDENAMIENTO

DRA. ROSA MARIA MICHEL NAVA

{
Escribir r1 en F;
Hacer b1 = verdadero; y k = k + 1;
Si (no es el fin de archivo de F1) entonces
{
Leer r1 de F1;
Hacer b1 = falso;
}
}
}
Si (q < part) entonces
{
Repetir Mientras (q < part y b2 = falso)
{
Escribir r2 en F;
Hacer b2 = verdadero; y q = q + 1;
Si (no es el fin de archivo de F2) entonces
{
Leer r2 de F2;
Hacer b2 = falso;
}
}
}
}
Si (b1 = falso) entonces Escribir r1 en F;
Si (b2 = falso) entonces Escribir r2 en F;
Repetir Mientras (no sea el fin de archivo de F1)
{
Leer r1 de F1;
Escribir r1 en F;
}
Repetir Mientras (no sea el fin de archivo de F2)
{
Leer r2 de F2;
Escribir r2 en F;
}
}
Anlisis de eficiencia del ordenamiento de mezcla directa
Existe una deficiencia de este procedimiento, no es muy prctico para archivos pequeos. El tiempo
requerido para el procedimiento es O(n*log(n)) puesto que no existen ms de log(n) pasos.
5.2.3 MEZCLA NATURAL
El mtodo de ordenacin mezcla natural tambin conocido por Mezcla equilibrada, es una optimizacin
del mtodo de mezcla directa.

19
ESTRUCTURA DE DATOS (ING.)

UNIDAD 5. METODOS DE ORDENAMIENTO

DRA. ROSA MARIA MICHEL NAVA

La idea central de este algoritmo consiste en realizar las particiones tomando secuencias ordenadas de
mxima longitud en lugar de secuencias de tamao fijo previamente determinadas. Luego realiza la fusin
de las secuencias ordenadas, alternativamente sobre dos archivos. Aplicando estas acciones en forma
repetida se lograr que el archivo original quede ordenado. Para la realizacin de este proceso de
ordenacin se necesitarn cuatro archivos. El archivo original F y tres archivos auxiliares a los que se
denominarn F1, F2 y F3. De estos archivos, dos sern considerados de entrada y dos de salida; esto
alternativamente con el objeto de realizar la fusin-particin. El proceso termina cuando en la realizacin
de una fusin-particin el segundo archivo quede vaco.
Por ejemplo, suponiendo que se desea ordenar las claves del archivo F utilizando el mtodo de mezcla
natural:
F:

25
64

33
77

15
29

18
36

21
11

07

12

36

84

90

19

11

38

40

22

Los pasos que se realizan son los siguientes:


PARTICION INICIAL:
F2:
F3:

25
15

33
18

07
21

12
19

36
38

84
40

90
29

22
36

64

77

33
38

22
40

29
84

36
90

64
11

77

19
64

21
77

25

33

36

38

40

84

90

18
90

19

21

22

25

29

33

36

36

PRIMERA FUSION-PARTICION:
F:
F1:

15
07

18
12

21
19

25
36

SEGUNDA FUSION-PARTICION:
F2:
F3:

07
11

12
22

15
29

18
36

TERCERA FUSION-PARTICION:
F:

07
40

11
64

12
77

15
84

F1:
El algoritmo de ordenacin por el mtodo Mezcla natural es el siguiente:
Algoritmo mezcla_natural
// El algoritmo ordena los elementos del archivo F
// Utiliza tres archivos auxiliares F1, F2 y F3
// band es una variable de tipo booleano

38

20
ESTRUCTURA DE DATOS (ING.)

UNIDAD 5. METODOS DE ORDENAMIENTO

DRA. ROSA MARIA MICHEL NAVA

Mezcla_natural (F, F1, F2, F3)


{
Llamar al algoritmo particin_inicial con F, F2 y F3;
Hacer band = verdadero;
Repetir
{
Si (band = verdadero) entonces
{
Llamar al algoritmo Particin_fusion con F2, F3, F y F1;
Hacer band = falso;
}
Sino
{
Llamar al algoritmo Particin_fusion con F, F1, F2 y F3;
Hacer band = verdadero;
}
}Hasta que (F1 = vaco F3 = vaco);
}

Algoritmo particin_inicial
// El algoritmo produce la particin inicial del archivo F en dos archivos auxiliares, F2 y F3
// aux y r son variables de tipo entero
// band es una variable de tipo booleano
Particin_inicial (F, F2, F3)
{
Abrir el archivo F para lectura;
Abrir los archivos F2 y F3 para escritura;
Leer r de F;
Escribir r en F2;
Hacer band = verdadero y aux = r;
Repetir Mientras (no sea el fin del archivo de F)
{
Leer r de F;
Si (r >= aux) entonces
{
Hacer aux = r;
Si (band = verdadero) entonces Escribir r en F2;
Sino Escribir r en F3;
}
Sino
{
Hacer aux = r;
Si (band = verdadero) entonces
{

21
ESTRUCTURA DE DATOS (ING.)

UNIDAD 5. METODOS DE ORDENAMIENTO

DRA. ROSA MARIA MICHEL NAVA

Escribir r en F3;
Hacer band = falso;
}
Sino
{
Escribir r en F2;
Hacer band = verdadero;
}
}
}
}
Algoritmo particin_fusin
// El algoritmo produce la particin y la fusin de los archivos FA y FB, en los archivos FC y FD
// r1, r2 y aux son variables de tipo entero
// b, dele1 y dele2 son variables de tipo booleano
Particin_fusion (FA, FB, FC, FD)
{
Abrir los archivos FA y FB para lectura;
Abrir los archivos FC y FD para escritura;
Hacer b = verdadero;
Leer r1 de FA y r2 de FB;
Si (r1 < r2) entonces aux = r1;
Sino aux = r2 ;
Hacer dele1 = falso y dele2 = falso ;
Repetir Mientras ((no sea el fin de archivo de FA o dele1 != verdadero) y
(no sea el fin de archivo de FB o dele2 != verdadero))
{
Si (dele1 = verdadero) entonces
{
Leer r1 de FA;
Hacer dele1 = falso;
}
Si (dele2 = verdadero) entonces
{
Leer r2 de FB;
Hacer dele2 = falso;
}
Si (r1 < r2) entonces
{
Si (r1 >= aux) entonces
{
Llamar al algoritmo Ayuda1 con aux, r1, FC, FD y b;
Hacer dele1 = verdadero;
}

22
ESTRUCTURA DE DATOS (ING.)

UNIDAD 5. METODOS DE ORDENAMIENTO

DRA. ROSA MARIA MICHEL NAVA

Sino
{
Si (r2 >= aux) entonces
{
Llamar al algoritmo Ayuda1 con aux, r2, FC, FD y b;
Hacer dele2 = verdadero;
}
Sino
{
Llamar al algoritmo Ayuda2 con aux, r1, FC, FD y b;
Hacer dele1 = verdadero;
}
}
}
Sino
{
Si (r2 >= aux) entonces
{
Llamar al algoritmo Ayuda1 con aux, r2, FC, FD y b;
Hacer dele2 = verdadero;
}
Sino
{
Si (r1 >= aux) entonces
{
Llamar al algoritmo Ayuda1 con aux, r1, FC, FD y b;
Hacer dele1 = verdadero;
}
Sino
{
Llamar al algoritmo Ayuda2 con aux, r2, FC, FD y b;
Hacer dele2 = verdadero;
}
}
}
}
Si (dele1 = verdadero y es el fin de archivo de FA) entonces
Llamar al algoritmo Ayuda3 con r2, FB, FC, FD y b;
Si (dele2 = verdadero y es el fin de archivo de FB) entonces
Llamar al algoritmo Ayuda3 con r1, FA, FC, FD y b;
}
Algoritmo ayuda1
// El algoritmo escribe el elemento r en el archivo FC o FD
Ayuda1 (aux, r, FC, FD, b)

23
ESTRUCTURA DE DATOS (ING.)

UNIDAD 5. METODOS DE ORDENAMIENTO

DRA. ROSA MARIA MICHEL NAVA

{
Hacer aux = r;
Si (b = verdadero) entonces Escribir r en FC;
Sino Escribir r en FD;
}
Algoritmo ayuda2
// El algoritmo escribe el elemento r en el archivo desactivado y luego activa el mismo
Ayuda2 (aux, r, FC, FD, b)
{
Hacer aux = r;
Si (b = verdadero) entonces
{
Escribir r en FD;
Hacer b = balso;
}
Sino
{
Escribir r en FC;
Hacer b = verdadero;
}
}
Algoritmo ayuda3
// El algoritmo escribe el elemento r y los elementos de F pendientes de tratar en el archivo FC o FD
Ayuda3 (r, F, FC, FD, b)
{
Si (r >= aux) entonces Llamar al algoritmo Ayuda1 con r, FC, FD y b ;
Sino Llamar al algoritmo Ayuda2 con r, FC, FD y b;
Repetir Mientras (no sea el fin de archivo de F)
{
Leer r de f;
Si (r >= aux) entonces Llamar al algoritmo Ayuda1 con aux, r, FC, FD y b;
Sino Llamar al algoritmo Ayuda2 con aux, r, FC, FD y b;
}
}
Ordenar archivos es siempre una tarea muy lenta y requiere mucho tiempo. Este algoritmo, adems requiere
el doble de espacio en disco del que ocupa el fichero a ordenar, por ejemplo, para ordenar un fichero de 500
megas se necesitan otros 500 megas de disco libres. Sin embargo, un fichero como el mencionado, sera
muy difcil de ordenar en memoria.
El tiempo requerido para el procedimiento es O(n*log(n)).

Anda mungkin juga menyukai