Ordenación por Mezcla Directa

Anuncio
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
Descargar