Algoritmo de Ordenación Shell

Este método, también conocido como método de ordenación por inserción con incrementos decrecientes, es una mejora del método de inserción directa. Consiste en ordenar por inserción los elementos que difieren S1 posiciones. A continuación se ordenan los que difieren S2 posiciones, siendo S2 < S1. Se repite el mismo proceso sucesivamente, considerando valores Si decrecientes, hasta alcanzar el valor 1, ordenando como último paso los elementos situados a distancia 1. Los valores S1, S2, ... suelen denominarse incrementos. En el peor de los casos, toda la ordenación se realizará al considerar la última distancia, que garantiza la ordenación.
Las operaciones del algoritmo se podrían esquematizar como sigue:
  1. Tomar una distancia de comparación inicial.
  2. Ordenar entre sí los elementos situados a esa distancia.
  3. Reducir la distancia de comparación. Si es mayor o igual que 1, volver al paso 2.
Se pueden elegir diferentes secuencias de incrementos o distancias. En nuestro caso la distancia inicial es igual a la mitad del número de elementos del vector. En cada nueva iteración se reduce la distancia previa a la mitad, tomando en la última iteración distancia 1.

PSEUDOCÓDIGO
    MÓDULO ordenacion_shell

    DATOS
       PARÁMETROS
           Transforma V() de tipo T
           Recibe N entera
       VARIABLES
           I, J, DISTANCIA, AUX enteras
    INICIO
           DISTANCIA ← N
           Mientras ( DISTANCIA ≠ 1 ) hacer
              DISTANCIA ← DISTANCIA\2      ** división entera
              Para I desde DISTANCIA+1 hasta N
                  AUX ← V(I)
                  J ← I
                  Mientras (  (J-DISTANCIA) ≥ 1)  y (V(J-DISTANCIA) > AUX)  ) hacer
                      V(J) ← V(J-DISTANCIA)
                      J ← J-DISTANCIA
                  fin-mientras
                  V(J) ← AUX
              fin-para
           fin-mientras
    FIN

CÓDIGO C
/*Ordena un vector (de menor a mayor) por el método de ordenación por shell*/
shell(int *v, int n)
{
int i, j, dist, aux;

dist=n;
	while(dist!=1)
	{
	dist=dist/2;
	
		for(i=dist;i<n;i++)
		{
		aux=v[i];
		j=i;
			while((j-(dist-1)>=1) && (v[j-dist]>aux))
			{
			v[j]=v[j-dist];
			j=j-dist;
			}
		v[j]=aux;
		}
	}
}

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)