Clasificación por mezcla Directa, con 2 Vectores: Puede usarse un vector en lugar de dos fichero si se le considera como una secuencia con 2 extremos y se inspecciona de forma secuencial. En lugar de realizar la mezcla a partir de 2 ficheros, pueden tomarse artículos de ambos extremos del vector. De esta forma , el esquema general de la fase combinada de mezcla y división puede ilustrarse en la figura i k j l Método de mezcla directa con dos vectores El destino de los elementos mezclados se modifica déspues de cada par ordenado en la primera pasada, cada cuádruplo ordenado en la segunda pasada, etc…, rellenando así alternativamente las dos secuencias de destino, representadas por ambos extremos de un único vector. Después de cada pasada, ambos vectores intercambian sus papeles; el de origen se convierte en el de destino, y viceversa. Puede conseguirse una simplificación mayor uniendo en un solo vector de tamaño doble los dos vectores simples conceptualmente distintos. Así los datos se representarán por a:ARRAY[1..2n] of item -Los índices i,j designan los dos ítems origen mientras k y l son los índices destinos. - Los datos iniciales son a1,….,an -Up: variable booleana para designar la dirección del flujo de datos. -Cuando Up=true significa que en la pasada en curso los componentes a1,….,an se moverán hacia las variables an+1,….,a2n -Cuando Up=false significa que en la pasada en curso los componentes an+1,….,a2n se moverán hacia las variables a1,….,an -p: designa la longitud de las secuencias a combinar (cada cuanto se realizan los agrupamientos). -m: designa el número de ítems en las dos sucesiones que quedan por mezclar. -n: número de elementos a clasificar -q y r: longitudes de las secuencias a mezclar -h: indica el incremento de los índices (i,k) o decremento(j,l) -simplificación:el destino siempre se designa como k. Tenemos el siguiente vector de tamaño 2n y visualizar paso a paso el algoritmo: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 44 55 12 42 67 06 18 94 i l j k PROCEDURE Mezcla Directa VAR i,j,k,l,t:index; h,m,p,q,r:INTEGER; Up:BOOLEAN; BEGIN (*inicializar*) Up:=true; p:=1; REPEAT h:=1; m:=n;/*m=8*/ /*Asigna indices según el flujo de datos*/ IF Up THEN i:=1;j:=n;k:=n+1;l:=2n; ELSE k:=1;l:=n;i:=n+1;j:=2n; END; REPEAT { mezclar un tramo de i, j en k} /*contempla el caso de que n no sea potencia de 2*/ IF 8>=1 THEN q=1 ELSE no se ejecuta END; m:=m-q;/*m=7*/ IF 7>=1 THEN r=1 ELSE no se ejecuta END; m:=m-r;/*m=6*/ WHILE (q#0) & (r#0) DO IF a[i]<a[j] THEN a[k]:=a[i];k:=k+h;i:=i+1;q:=q-1; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 55 12 42 67 06 18 94 44 i j k l ELSE a[k]:=a[j];k:=k+h;j:=j-1;r:=r-1; END END; WHILE r>0 DO a[10]:=a[9]; k:=k+h; j:=8-1;/*j=7*/ r:=r-0;/*r=0*/ 3 4 5 6 7 8 9 10 11 12 13 14 15 1 2 16 55 12 42 67 06 18 i j l 44 94 k WHILE q>0 DO a[k]:=a[i]; k:=k+h ; i:=i+1; q:=q-1 END; h:=-h;/*h=-1*/ t:=k;/*t=n+3*/ k:=l; l:=t;/*l=n+3*/ UNTIL m=0 (**************************************************) (*la siguiente pasada de REPEAT*) IF 6>=1 THEN q=1 ELSE no se ejecuta END; m:=m-q;/*m=5*/ IF 5>=1 THEN r=1 ELSE no se ejecuta END; m:=m-r;/*m=4*/ WHILE (q#0) & (r#0) DO IF a[i]<a[j] THEN a[k]:=a[i];k:=k+h;i:=i+1;q:=q-1; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 55 12 42 67 06 44 94 18 i j L k ELSE a[k]:=a[7];k:=k-1;j:=j-1;r:=r-1;/*r=0*/ END END; WHILE r>0 DO a[k]:=a[j]; k:=k+h; j:=j-1; r:=r-0; 1 16 WHILE q>0 DO a[k]:=a[i]; k:=k+h ; i:=i+1; q:=q-1 END; 2 3 4 5 6 7 8 9 10 11 12 12 42 67 06 i j 13 14 15 44 94 55 18 L h:=-h;/*h=1*/ t:=k;/*t=2n-2*/ k:=l; l:=t;/*l=2n-2*/ UNTIL m=0 (*otra pasada dentro del bucle *) IF 4>=1 THEN q=1 ELSE no se ejecuta END; m:=m-q;/*m=3*/ IF 3>=1 THEN r=1 ELSE no se ejecuta END; m:=m-r;/*m=2*/ WHILE (q#0) & (r#0) DO IF a[i]<a[j] THEN a[k]:=a[i];k:=k+h;i:=i+1;q:=q-1; k 1 2 16 3 4 5 6 7 8 9 10 11 12 13 14 15 12 42 67 44 94 06 i j k ELSE a[k]:=a[6];k:=k+1;j:=j-1;r:=r-1;/*r=0*/ END END; WHILE r>0 DO a[k]:=a[j]; k:=k+h; j:=j-1; r:=r-0; 1 16 WHILE q>0 DO a[k]:=a[3]; k:=k+1 ; i:=i+1/*i=4*/; q:=q-1 END; 2 3 4 5 6 7 8 9 10 11 12 42 67 i j 55 18 l 13 14 15 44 94 06 12 h:=-h;/*h=-1*/ t:=k;/*t=13*/ k:=l; l:=t;/*l=13*/ UNTIL m=0 (*Última pasada dentro del bucle*) IF 2>=1 THEN q=1 ELSE no se ejecuta END; m:=m-q;/*m=1*/ IF 1>=1 THEN r=1 ELSE no se ejecuta END; m:=m-r;/*m=0*/ WHILE (q#0) & (r#0) DO IF a[i]<a[j] THEN a[k]:=a[4];k:=k-1;i:=i+1;q:=q-1; k 55 18 l 1 2 16 3 4 5 6 7 8 9 10 11 12 42 67 44 94 06 12 i j ELSE a[k]:=a[j];k:=k+1;j:=j-1;r:=r-1;/*r=0*/ END END; WHILE r>0 DO a[k]:=a[5]; k:=k-1; j:=j-1; r:=r-0; 1 16 WHILE q>0 DO a[k]:=a[i]; k:=k+1 ; i:=i+1; q:=q-1 END; 2 3 4 5 6 7 8 9 10 11 12 j i 13 14 15 42 55 18 l =k k 13 14 15 44 94 06 12 67 42 55 18 l=k h:=-h;/*h=1*/ t:=k; k:=l; l:=t; UNTIL m=0 (*fin de fase*) Up=¬Up;(*cambiar el flujo de datos*) p:=2p UNTIL p>=n (*fin de clasificación*) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 44 94 06 12 67 42 55 18 k l i j REPEAT h:=1; m:=n;/*m=8*/ /*Asigna indices según el flujo de datos*/ IF Up THEN i:=1;j:=n;k:=n+1;l:=2n; ELSE k:=1;l:=n;i:=n+1;j:=2n; END; REPEAT { mezclar un tramo de i, j en k} /*contempla el caso de que n no sea potencia de 2*/ IF 8>=1 THEN q=1 ELSE no se ejecuta END; m:=m-q;/*m=7*/ IF 7>=1 THEN r=1 ELSE no se ejecuta END; m:=m-r;/*m=6*/ WHILE (q#0) & (r#0) DO IF a[i]<a[j] THEN a[k]:=a[i];k:=k+h;i:=i+1;q:=q-1; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 44 94 06 12 67 42 55 18 k l i j ELSE a[k]:=a[16];k:=k+1;j:=16-1;r:=r-1;/*r=0*/ 1 2 16 18 k 3 4 5 6 7 8 9 10 11 12 13 14 15 44 94 06 12 67 42 55 l i j END END; WHILE r>0 DO a[k]:=a[j]; k:=k+h; j:=j-1; r:=r-0; END; WHILE q>0 DO a[k]:=a[9]; k:=k+1 ; i:=i+1; q:=q-1 END; 2 3 4 5 6 7 8 9 10 11 12 1 16 18 44 k h:=-h;/*h=-1*/ t:=k;/*t=3*/ k:=l; l:=t;/*l=3*/ 1 2 3 4 5 16 18 44 L 94 06 12 67 42 55 i j l 6 7 8 9 k 13 14 15 10 11 12 13 14 15 94 06 12 67 42 55 i j UNTIL m=0 ; (*otra pasada sobre el bucle*) IF 6>=1 THEN q=1 ELSE no se ejecuta END; m:=m-q;/*m=5*/ IF 5>=1 THEN r=1 ELSE no se ejecuta END; m:=m-r;/*m=4*/ WHILE (q#0) & (r#0) DO IF a[i]<a[j] THEN a[k]:=a[i];k:=k+h;i:=i+1;q:=q-1; 1 2 3 16 18 44 L ELSE 4 5 6 7 8 9 10 11 12 13 14 15 94 06 12 67 42 55 i j k a[k]:=a[15];k:=k-1;j:=15-1;r:=r-1;/*r=0*/ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 18 44 55 94 06 12 67 42 L k i j END END; WHILE r>0 DO a[k]:=a[j]; k:=k+h; j:=j-1; r:=r-0; END; WHILE q>0 DO a[k]:=a[10]; k:=k-1 ; i:=i+1; q:=q-1 1 2 3 16 18 44 L 4 5 END; h:=-h;/*h=1*/ t:=k;/*t=6*/ k:=l; l:=t;/*l=6*/ 1 2 3 4 5 16 6 7 8 9 94 55 7 8 13 14 15 06 12 67 42 i j k 6 10 11 12 9 10 11 12 13 14 15 18 44 94 55 k L 06 12 67 42 i j UNTIL m=0 IF 4>=1 THEN q=1 ELSE no se ejecuta END; m:=m-q;/*m=3*/ IF 3>=1 THEN r=1 ELSE no se ejecuta END; m:=m-r;/*m=2*/ WHILE (q#0) & (r#0) DO IF a[i]<a[j] THEN a[k]:=a[i];k:=k+h;i:=i+1;q:=q-1; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 18 44 06 94 55 12 67 42 K L i j ELSE a[k]:=a[j];k:=k+1;j:=j-1;r:=r-1;/*r=0*/ END END; WHILE r>0 DO a[k]:=a[j]; k:=k+h; j:=j-1; r:=r-0; END; WHILE q>0 DO a[k]:=a[i]; k:=k-1 ; i:=i+1; q:=q-1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 18 44 06 12 94 55 67 42 K L i j END; h:=-h;/*h=-1*/ t:=k;/*t=5*/ k:=l; l:=t;/*l=5*/ UNTIL m=0 (*otra pasada*) IF 2>=1 THEN q=1 ELSE no se ejecuta END; m:=m-q;/*m=1*/ IF 1>=1 THEN r=1 ELSE no se ejecuta END; m:=m-r;/*m=0*/ WHILE (q#0) & (r#0) DO IF a[i]<a[j] THEN a[k]:=a[i];k:=k+h;i:=i+1;q:=q-1; 1 2 3 4 5 16 18 44 06 12 l ELSE 6 7 8 9 10 11 12 94 55 k 13 14 15 67 42 i j a[k]:=a[14];k:=k-1;j:=j-1;r:=r-1;/*r=0*/ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 18 44 06 12 42 94 55 67 l=k i=j END END; WHILE r>0 DO a[k]:=a[j]; k:=k+h; j:=j-1; r:=r-0; END; WHILE q>0 DO a[k]:=a[i]; k:=k-1 ; i:=i+1; q:=q-1 1 2 3 4 5 6 7 8 9 10 11 12 16 18 44 06 12 67 42 94 55 END; h:=-h; t:=k; k:=l; l:=t; UNTIL m=0 Up:=¬Up;p:=2p;/*p:=4*/ 13 14 15 1 2 3 4 5 6 7 8 16 18 44 06 12 67 42 94 55 i j l 9 k 10 11 12 13 14 15