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