Método Shell
El ordenamiento
Shell (Shell
sort en
inglés) es un
algoritmo de ordenamiento. El método se
denomina Shell en honor de
su inventor Donald
Shell. Su implementación original, requiere comparaciones
e intercambios en el peor caso. Un cambio menor
presentado en el libro de V. Pratt produce una
implementación con un rendimiento de
O en el peor
caso. Esto es mejor que las
comparaciones requeridas por algoritmos simples
pero peor que el óptimo.
Aunque es fácil desarrollar un sentido intuitivo de
cómo funciona este algoritmo, es muy difícil analizar
su tiempo de ejecución.
El Shell sort es una generalización del ordenamiento por insercion:
El
algoritmo Shell sort mejora el ordenamiento por
inserción comparando elementos separados por un
espacio de varias posiciones. Esto permite que un
elemento haga "pasos más grandes" hacia su posición
esperada. Los pasos múltiples sobre los datos se hacen
con tamaños de espacio cada vez más pequeños. El
último paso del Shell sort es un simple ordenamiento
por inserción, pero para entonces, ya está garantizado
que los datos del vector están casi ordenados.
Ejemplo: Considere
un valor pequeño que está inicialmente almacenado en
el final del vector.
Usando un ordenamiento O(n2)
como el
ordenamiento de burbuja
o el ordenamiento
por insercion, tomará aproximadamente
n comparaciones
e intercambios para mover este valor hacia el otro
extremo del vector. El Shell sort primero mueve los
valores usando tamaños de espacio gigantes, de manera
que un valor pequeño se moverá bastantes posiciones
hacia su posición final, con sólo unas pocas
comparaciones e intercambios.
Uno
puede visualizar el algoritmo Shell sort de la
siguiente manera: coloque la lista en una tabla y
ordene las columnas (usando un
ordenamiento por insercion). Repita este
proceso, cada vez con un número menor de columnas más
largas. Al final, la tabla tiene sólo una columna.
Mientras que transformar la lista en una tabla hace
más fácil visualizarlo, el algoritmo propiamente hace
su ordenamiento en contexto (incrementando el índice
por el tamaño de paso, esto es usando
i
+= tamaño_de_paso
en vez dei++ ).
Por
ejemplo, considere una lista de números como
[
13 14 94 33 82 25 59 94 65 23 45 27 73 25 39 10 ] .
Si comenzamos con un tamaño de paso de 5, podríamos
visualizar esto dividiendo la lista de números en una
tabla con 5 columnas. Esto quedaría así:
25 59 94 65 23 45 27 73 25 39 10 Entonces ordenamos cada columna, lo que nos da 10 14 73 25 23 13 27 94 33 39 25 59 94 65 82 45
Cuando
lo leemos de nuevo como una única lista de números,
obtenemos[10 14 73 25 23 13 27 94 33 39 25 59 94 65 82
45]. Aquí, el 10 que estaba en el extremo final, se ha
movido hasta el estremo inicial. Esta lista es
entonces de nuevo ordenada usando un ordenamiento con
un espacio de 3 posiciones, y después un ordenamiento
con un espacio de 1 posición (ordenamiento por
inserción simple).
|