UNIDAD 5.
METODOS DE ORDENAMIENTO
COMPETENCIA ESPECIFICA DE LA UNIDAD.
15
67
16
44
27
12
35
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.)
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
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.)
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
= (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
67
16
44
27
15
35
67
35
15
16
44
27
4
ESTRUCTURA DE DATOS (ING.)
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
5
ESTRUCTURA DE DATOS (ING.)
// 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.)
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.)
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
28
35
36
44
56
8
ESTRUCTURA DE DATOS (ING.)
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.)
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.)
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.)
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.)
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).
s se cumple la condicin
Se escribe 09 en el archivo de salida F3 y se vuelve a leer otra clave de F1 (18).
no se cumple la condicin
Se escribe 10 en el archivo de salida F3 y se vuelve a leer otra clave de F2 (16).
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
82
87
13
ESTRUCTURA DE DATOS (ING.)
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.)
}
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
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
84
19
40
22
15
ESTRUCTURA DE DATOS (ING.)
F:
15
22
18
40
25
64
33
77
7
11
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
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
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
7
40
11
64
12
77
15
84
16
ESTRUCTURA DE DATOS (ING.)
17
ESTRUCTURA DE DATOS (ING.)
18
ESTRUCTURA DE DATOS (ING.)
{
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.)
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
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.)
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.)
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.)
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.)
{
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)).