Está en la página 1de 11

Mezcla Directa (MERGE)

7.3 Mezcla Directa (MERGE) a) Descripcion Este metodo de llama mezcla porque combina dos o mas secuencias en una sola secuencia ordenada por medio de la seleccion repetida de los componenetes accesibles en ese momento. Un arreglo individual puede usarse en lugar de dos secuencias si se considera como de doble extremo. En este caso se tomaran elementos de los dos extremos del arreglo para hacer la mezcla. El destino de los elementos combinados se cambia despues de que cada par ha sido ordenado para llenar uniformemente las dos secuencias que son el destino. Despues de cada pasada los dos extremos del arreglo intercambian de papel, la fuente se convierte en el nuevo destino y viceversa. b) Algoritmo 1.Inicio 2.Dividir la secuencia A en dos mitades denomindas B y C. 3.Mezclar B y C combinando cada elemento en pares ordenados. 4.- Llamar A a la secuencia mezclada y repetir los pasos 1 y 2, esta vez combinando los pares en cuadriples ordenados. 5.- Repetir los pasos anteriores duplicando cada vez la longitud de las secuencias combinadas hasta que quede ordenada la secuencia original. 6.Fin del Algoritmo. c) Diagrama de Flujo

d) Fuente A={29,17,31,25, 1 2 UP=TRUE P=1 do H=1 M=N,M=4 Si I=1 J=N,J=4 K=N+1,K=4+1= L=2*N,L=2*4= do Si Q=P M=M-Q Si R=P,R= M=M-R,M=3-1=

Corrida , 3 4 , 5

de , 6 ,} 7

Escritorio Destino N=4 8

UP=TRUE,TRUE=TRUE

(Si)

5 8 2 (Si)

M>=P,4>=1

M>=P,3>=1

(Si) 1 2

Mientras Q!=0 1!=0 Si 29<25> A[K]=A[J],A[5]=A[4]= K=K+H,K=5+1= J=J-1,J=4-1= R=R-1,R=1-1= -------> Mientras 1!=0 Mientras Mientras A[K]=A[I],A[6]=A[1],A[6]=29 K=K+1,K=6+1= I=I+1,I=1+1= Q=Q-1.Q=1-1= Mientras H=-H,H=-1 T=K,T=7 K=L,K=8 L=T,L=7

and and

R!=0 1!=0

------------

|A| (Si) A[I] 23 6 3 0 |A|

(Si) R>0,0>0

and Q>0,1>0

0!=0 (No)

(No)

(Sale) (Sale) (Si) 7 2 0 (Sale) der->izq

0>0

(No)

7.1.2 Mezcla Natural


Ordenacin por el mtodo de mezcla equilibrada El mtodo de ordenacin por mezcla equilibrada, conocido como natural, es una optimization del metodo de mezcla directa. tambien

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 se realiza la fusion de las secuencias ordenadas, en alternada, sobre dos archivos. Aplicando estas acciones en forma repetida se lograr el archivo original quede ordenado. Para la realization de este proceso de ordenacin se necesitaran cuatro archivos. El archivo original F y tres archivos auxiliares a los que se denominara F1, F2 y F3. De estos archivos, dos sern considerados de entrada y dos de salida; esto, de manera alternada, con el objeto de realizar la fusion-particin. El proceso termina cuando en la realizacin de una fusion-particin el segundo archivo quede vaco. Supongamos que se desea ordenar las claves del archivo F utilizando el mtodo mezcla equilibrada. F: 09 75 14 68 29 17 31 25 04 05 13 18 72 46 61 Los pasos que se realizan son: PARTICIN INICIAL F2: 09 75' 29' 25' 46 61' F3: 14 68' 17 31' 04 05 13 18 72' PRIMERA FUSION-PARTICION F: 09 14 68 75' 04 05 13 18 25 46 61 72 ' F1: 17 29 31' SEGUNDA FUSION-PARTICION F1: 09 14 17 29 31 68 75' F3: 04 05 13 18 25 46 61 72' TERCERA FUSION-PARTICION F: 04 05 09 13 14 17 18 25 29 31 46 61 68 72 75 Observe que al realizar la tercera fusion-particin el segundo archivo queda vaco; por lo tanto, se puede afirmar que el archivo ya se encuentra ordenado. A continuacin se presenta la description formal del algoritmo de mezcla equilibrada. Mezcla_equilibrada (F, F1, F2, El algoritmo ordena los elementos del archivo F por el metodo de equilibrada. Utiliza tres archivos auxiliares F1, F2 y F3 BAND variable de tipo booleano 1. Llamar al algoritmo Particion inicial con F, F2 2. Llamar al algoritmo Particion fusion con F1, F3, F F3) mezcla es una y y F3 F1

3. Hacer 4. Mientras

BAND <- FALSO VACIO)) Repetir = VERDADERO) entonces Llamar al algoritmo Particion_fusion con F2, F3, F y F1 Hacer BAND <- FALSO si no Llamar al algoritmo Particion_fusion con F, F1,F2 y F3 Hacer BAND <- VERDADERO 4.2. Fin del condicional del paso 4.1 5. Fin del ciclo del paso 4 El algoritmo requiere para su funcionamiento de dos algoritmos auxiliares, Particion_inicial yParticion_fusion, los cuales se presentan a continuation. Particion_inicial (F, F2, F3)El algoritmo produce la particion 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 1. Abrir el archivo F para lectura. 2. Abrir los archivos F2 y F3 para escritura. 3. Leer R de F. 4. Escribir R en F2. 5. Hacer BAND <- VERDADERO y AUX <- R 6. Mientras (no sea el fin de archivo de F) Repetir Leer R de F 6.1 Si (R a AUX) entonces Hacer AUX <-R 6.1.1 Si (BAND = VERDADERO) entonces Escribir R en F2 si no Escribir R en F3 6.1.2. Fin del condicional del paso 6.1.1 si no Hacer AUX <- R 6.1.3. Si (BAND = VERDADERO) entonces Escribir R en F3 Hacer BAND <- FALSO si no Escribir R en F2 Hacer BAND <- VERDADERO 6.1.4. Fin del condicional del paso 6.1.3 6.2. Fin del condicional del paso 6.1 7. Fin del ciclo del paso 6 8. Cerrar los archivos F, F2 y F3 Particion_fusion (FA, FB, FC, FD) ((F1 VACIO) o 4.1. Si (BAND (F3

El algoritmo produce la particion y la fusion de los archivos FA y FB, en los archivos FC y FD R1, R2 y AUX son variables de tipo entero. BANl, BAN2 y BAN3 son variables de tipo booleano 1. Abrir los archivos FA y FBpara lectura. 2. Abrir los archivos FC y FD para escritura. 3. Hacer BAN1 <- VERDADERO, BAN2 <- VERDADERO, BAN3 <- VERDADERO y AUX <- -32 768 {AUX se inicializa con un valor negativo alto} 4. Mientras ((no sea el fin de archivo de FA) o (BANl = FALSO)) y ((no sea el fin de archivo de FB) o ((BAN2 = FALSO)) Repetir 4.1. Si (BAN1 = VERDADERO) entonces Leer R1 de FA Hacer BAN1 <- FALSO 4.2. Fin del condicional del paso 4.1 4.3 Si (BAN2 = VERDADERO) entonces Leer R2 de FB Hacer BAN2 <- FALSO 4.4. Fin del condicional del paso 4.3 4.5. Si (R1 < R2) entonces 4.5.1. Si (R1 AUX) entonces 4.5.1.1. S(BAN3 = VERDADERO) entonces Escribir R1 en FC si no

condicional AUX <R1

del

Escribir R1 en FD 4.5.1.2. Fin del paso 4.5.1.1 Hacer BAN1 <- VERDADERO y si no 4.5.1.3.Si (BAN3 =

VERDADERO) entonces Escribir R2 en FC Hacer BAN3 <- FALSO si no Escribir R2 en FD Hacer condicional del paso BAN3 <- VERDADERO 4.5.1.4 Fin del 4.5.1.3

VERDADERO

Si (BAN3

Hacer BAN2 <AUX <- -32 768 4.5.2. Fin del condicional del paso 4.5.1 si no 4.5.3 Si (R2 AUX) entonces 4.5.3.1. = VERDADERO) entonces Escribir R2 en FC si no Escribir R2 en FD 4.5.3.2. paso 4.5.3.1 Hacer AUX <- R2 Si no 4.5.3.3. VERDADERO) entonces Escribir R1 en Hacer si Escribir Hacer R1 en FC

Fin

del

condicional y

del

BAN2 <- VERDADERO

Si (BAN3

BAN3 <- FALSO no FD

Fin

del

BAN1 <- VERDADERO

5. Fin 6. Si (BAN1

del

el

fin

BAN3 <- VERDADERO 4.5.3.4. condicional del paso 4.5.3.3 Hacer y AUX <- -32 768 4.5.4. Fin del condicional del paso 4.5.3 4.6. Fin del condicional del paso 4.5 ciclo del paso 4 = FALSO) entonces 6.1. Si (BAN3 = VERDADERO) entonces Escribir R1 en FC 6.1.1. Mientras (no sea de archivo de FA) Repetir

de R1 en paso

el de FA

fin

de

archivo

Leer R1 FA Escribir FC 6.1.2. Fin del ciclo del 6.1.1 si no Escribir R1 en FD 6.1.3. Mientras (no sea de FA) Repetir Leer R1

Escribir R1 en FD 6.1.4.Fin del ciclo del paso 6.1.3 6.2. Fin del condicional del paso 6.1 7. Fin del condicional del paso 6 8. Si (BAN2 = FALSO) entonces 8.1 S'(BAN3=VERDADERO) entonces Escribir R2 en FC 8.1.1 Mientras (no sea el fin de archivo de FB) Repetir Leer R2 de FB Escribir R2 en FC 8.1.2 Fin del ciclo del paso 8.1.1 si no Escribir R1 en FD 8.1.3. Mientras (no sea el fin de archivo de FB) Repetir Leer R2 de FB Escribir R2 en FD 8.1.4. Fin del ciclo del paso 8.1.3 8.2. Fin del condicional del paso 8.1 9. Fin del condicional del paso 8 10.Cerrar los archivos FA, FB, FC y FD Ejemplo en lenjuage C void mezclaEquilibrada(int archf, int archf1, int archf2, int archf3){ int archivo_vacio=ARCHIVO_NINGUNO; boolean band; particionInicial(archf, archf2, archf3); //imprimir("despus de particin inicial"); band = true; do{ if(band){ particionFusion(archf2, archf3, archf, archf1);

//imprimir("despus de particin fusin con band=true"); band=false; }else{ particionFusion(archf, archf1, archf2, archf3); //imprimir("despus de particin fusin con band=false"); band=true; } abrirL(archf1); archivo_vacio=ARCHIVO_F1; cerrar(archf1);

if(fin(archf1))

if(archivo_vacio==ARCHIVO_NINGUNO){ abrirL(archf3); if(fin(archf3)) archivo_vacio=ARCHIVO_F3; cerrar(archf3); } }while(archivo_vacio==ARCHIVO_NINGUNO); imprimir("al final"); printf("el archivo que est vaco es: %d\nEl listado final est en el: %d\n", archivo_vacio, archivo_vacio-1); } void particionInicial(int archf, registro ltimo sino, int archf2, int archf3){ r; f2, f3 */ band;

/*

Si

band==true, *

el

aux, registro se escribi fue en boolean

en

abrirL(archf); abrirE(archf2); abrirE(archf3); if(!leer(archf, printf("Archivo &r)){ vaco\n"); cerrar(archf); cerrar(archf2); cerrar(archf3); exit(0); } escribir(archf2,r); band=true; aux=r; while(!fin(archf)){ leer(archf, &r);

if(r>=aux){ aux=r; if(band){ escribir(archf2,r); }else{ escribir(archf3,r); } }else{ aux=r; if(band){ escribir(archf3,r); band=false; }else{ escribir(archf2,r); band=true; } } } cerrar(archf); cerrar(archf2); cerrar(archf3); } void particionFusion(int archfa, int archfb, int archfc, int registro aux, r1, boolean band, dele1, archfd){ r2; dele2;

abrirL(archfa); abrirL(archfb); abrirE(archfc); abrirE(archfd); band leer(archfa, leer(archfb, aux aux dele2 dele1!=true) = true; &r1); &r2); if(r1<=r2) = r1; else = r2; = false; (!fin(archfb) || if(dele1){ &r1); dele1=false; } if(dele2){

dele1 while((!fin(archfa) dele2!=true)){

= ||

&&

leer(archfa,

&r2); dele2=false; } if(r1<r2){ if(r1>=aux){ //printf("probando... aux %d, r1 %d, r2 %d\n", aux, r1, r2); archfd, band); dele1=true; } else if(r2>=aux){ //printf("probando... r1 %d, aux %d, r2 %d\n", r1, aux, r2); ayuda1(&aux, r2, archfc, archfd, band); dele2=true; } else{ //printf("probando... r1 %d, r2 %d, aux %d\n", r1, r2, aux); &band); true; } } else{ if(r2>=aux){ //printf("probando... aux %d, r2 %d, r1 %d\n", aux, r2, r1); ayuda1(&aux, r2, archfc, archfd, band); dele2=true; } else if(r1>=aux){ //printf("probando... r2 %d, aux %d, r1 %d\n", r2, aux, r1); ayuda1(&aux, r1, archfc, archfd, band); dele1=true; } else{ //printf("probando... r2 %d, r1 %d, aux %d\n", r2, r1, aux); ayuda2(&aux, r2, archfc, archfd, &band); dele2 = true; } } } //fin del while if(dele1 && fin(archfa)) ayuda3(&aux, r2, archfb, archfc, archfd, &band); if(dele2 && fin(archfb)) ayuda3(&aux, r1, archfa, archfc, archfd, &band); cerrar(archfa); cerrar(archfb); cerrar(archfc); ayuda2(&aux, r1, archfc, archfd, dele1 = ayuda1(&aux, r1, archfc,

leer(archfb,

cerrar(archfd); }

También podría gustarte