2. Historia
Denominado así por su desarrollador Donald
Shell (1959), ordena una estructura de una
manera similar a la del Bubble Sort (método
Burbuja), sin embargo no ordena elementos
adyacentes sino que utiliza una segmentación
entre los datos. Esta segmentación puede ser de
cualquier tamaño de acuerdo a una secuencia de
valores que empiezan con un valor grande y van
disminuyendo hasta llegar al '1'.
3. Características
• Se trata de un algoritmo de ordenación interna. Al igual
que cualquier otro de ordenación interna (los datos
están en memoria principal) podría utilizarse para
ordenación externa (en memoria secundaria) siempre y
cuando se disponga de acceso aleatorio, pero el
algoritmo no fue ideado para eso.
• Se basa en comparaciones e intercambios.
• No es estable: dados dos elementos que al
compararlos
sean
"iguales"
no
mantienen
necesariamente el orden relativo inicial entre ellos.
4. Características
• En cierto modo, puede considerarse una
ampliación del algoritmo de inserción directa,
con lo cual, conviene tenerlo claro antes de
meterse con el de Shell.
• No es un algoritmo en-línea.
• A diferencia del algoritmo de ordenación por
inserción,
este
algoritmo
intercambia
elementos distantes.
5. Descripción
• El ShellSort ordena subgrupos de elementos
separados K unidades (respecto de su posición en el
arreglo) del arreglo original. El valor K es llamado
incremento.
• Después de que los primeros K subgrupos han sido
ordenados (generalmente utilizando inserción
directa), se escoge un nuevo valor de K más pequeño,
y el arreglo es de nuevo partido entre el nuevo
conjunto de subgrupos. Cada uno de los subgrupos
mayores es ordenado y el proceso se repite de nuevo
con un valor más pequeño de K.
6. Descripción
• Cuando el incremento toma un valor de
1, todos los elementos pasan a formar
parte del subgrupo y se aplica inserción
directa.
• Para ilustrar mejor el proceso que sigue
el procedimiento ShellSort, se tomará
como ejemplo el vector :{6,1,5,2,3,4,0}.
8. Código
void ordenacionShell(int a[], int n)
{
int i, j, k, intervalo = n / 2;
int temp;
while (intervalo > 0)
{
for (i = intervalo; i ≤ n; i++)
{
j = i - intervalo;
while (j >= 0)
{
k = j + intervalo; //queda k=i;
if (a[j] <= a[k]) j = -1;
/*termina el bucle, par ordenado */
else
{
temp = a[j];
a[j] = a[k];
a[k] = temp;
j -= intervalo;
}
}
}
intervalo = intervalo / 2;
}
}
9. Ventajas
• Es un algoritmo muy simple teniendo
un tiempo de ejecución aceptable .
• Es uno de los algoritmos más
rápidos.
• No requiere memoria adicional.
10. Desventajas
• Su complejidad es difícil de calcular y
depende mucho de la secuencia de
incrementos que utilice.
• ShellSort es un algoritmo no es
estable porque se puede perder el
orden relativo inicial con facilidad .