Algoritmo de Ordenación MergeSort
- Se divide el vector en dos mitades.
- Se ordena cada una de las dos mitades aplicando MergeSort.
- Se mezclan ambas mitades, obteniendo un vector ordenado.
La operación de mezcla de dos vectores ordenados genera un nuevo vector que contiene los elementos de ambos y que conserva el orden. En este caso los dos vectores que se pretenden mezclar son realmente dos intervalos de posiciones del vector que estamos intentando ordenar. El primer subvector será el que comprende las posiciones IZQ a CEN del vector original, mientras que el segundo comprende las posiciones CEN+1 a DER.
Para realizar la mezcla, se comparan dos elementos de ambos subvectores, copiando en el destino el menor de ellos. A continuación se toma otro elemento del mismo origen del que se acaba de copiar el valor en el destino y prosigue la comparación. El proceso concluye cuando se hayan copiado, en el destino, todos los elementos de algún origen. En ese momento se copian, en el destino, todos los elementos del otro origen que aún no se hayan copiado.
Se utilizará un vector auxiliar, llamado TEMP, que permitirá almacenar, durante el proceso de mezcla, los valores que se están mezclando. Concluida la mezcla, se copian los elementos de este vector sobre el original, considerando sólo las posiciones del vector TEMP comprendidas entre IZQ y DER.
PSEUDOCÓDIGO
MÓDULO ordenacion_por_mezcla
DATOS
PARÁMETROS
Transforma V() de tipo T
Recibe IZQ entera
Recibe DER entera
VARIABLES
CEN entera
INICIO
Si ( IZQ < DER ) entonces
CEN <- (IZQ+DER)\2 ** división entera
ordenacion_por_mezcla(V, IZQ, CEN)
ordenacion_por_mezcla(V, CEN+1, DER)
mezclar(V, IZQ, CEN, DER)
fin-si
FIN
MÓDULO mezclar
DATOS
PARÁMETROS
Transforma V() de tipo T
Recibe IZQ entera
Recibe CEN entera
Recibe DER entera
VARIABLES
TEMP() de tipo T
I1, I2, I_TEMP entera
INICIO
I1 <- IZQ
I2 <- CEN+1
I_TEMP <- IZQ
Mientras( (I1 ≤ CEN) y (I2 ≤ DER) ) hacer
Si ( V(I1) < V(I2) ) entonces
TEMP(I_TEMP) <- V(I1)
I1 <- I1 + 1
sino
TEMP(I_TEMP) <- V(I2)
I2 <- I2 + 1
fin-si
I_TEMP <- I_TEMP + 1
fin-mientras
Mientras (I1 ≤ CEN) hacer
TEMP(I_TEMP) <- V(I1)
I1 <- I1 + 1
I_TEMP <- I_TEMP + 1
fin-mientras
Mientras (I2 ≤ DER) hacer
TEMP(I_TEMP) <- V(I2)
I2 <- I2 + 1
I_TEMP <- I_TEMP + 1
fin-mientras
Para I_TEMP desde IZQ hasta DER
V(I_TEMP) <- TEMP(I_TEMP)
fin-para
FIN
CÓDIGO C
/*Ordena un vector (de menor a mayor) por el método de mergeSort
**Nota: Utiliza Divide y vencerás */
mergeSort(int *v, int izq, int der)
{
int cen;
if(izq<der)
{
cen=(izq+der)/2;
mergeSort(v,izq,cen);
mergeSort(v,cen+1,der);
mezclar(v,izq,cen,der);
}
}
mezclar(int *v,int izq,int cen,int der)
{
int temp[der+1], i1, i2,itemp;
i1=izq;
i2=cen+1;
itemp=izq;
while((i1<=cen) && (i2<=der))
{
if(v[i1]<v[i2])
{
temp[itemp]=v[i1];
i1=i1+1;
}
else
{
temp[itemp]=v[i2];
i2=i2+1;
}
itemp=itemp+1;
}
while(i1<=cen)
{
temp[itemp]=v[i1];
i1=i1+1;
itemp=itemp+1;
}
while(i2<=der)
{
temp[itemp]=v[i2];
i2=i2+1;
itemp=itemp+1;
}
for(itemp=izq;itemp<=der;itemp++)
{
v[itemp]=temp[itemp];
}
}
Comentarios
Publicar un comentario