Algoritmo de Ordenación MergeSort

Este método se basa en la técnica "divide y vencerás". Los pasos que aplica son los siguientes:
  1. Se divide el vector en dos mitades.
  2. Se ordena cada una de las dos mitades aplicando MergeSort.
  3. Se mezclan ambas mitades, obteniendo un vector ordenado.
La operación de división se aplica, recursivamente, a cada una de las dos mitades obtenidas en cada paso. Cuando la partición obtenida tenga un solo elemento se la considera ordenada. A continuación se mezclarán las particiones de un elemento, obteniendo particiones ordenadas de dos elementos. El proceso de mezcla continuará, obteniendose particiones ordenadas cada vez más grandes, hasta obtener todo el 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];
	}
}

Volver al índice

Volver a Búsqueda y Ordenación Interna



Comentarios

Entradas populares de este blog

Algoritmo de ordenación por mezcla natural

Algoritmo de ordenación por mezcla directa

Algoritmo de Ordenación por Intercambio Directo (Burbuja)