Articulo de referencia

Shellsort

2 ) (worst known worst case gap sequence) O(''n'' log 2 ''n'') (best known worst case gap sequence) {{Cite book\n |last=Pratt\n |first=Vaughan Ronald |author-link=Vaughan Ronald...

Los pasos de Shellsort.
Intercambio de pares de elementos en pasos sucesivos de Shellsort con huecos 5, 3, 1

Shellsort , también conocido como Shell sort o método de Shell , es un algoritmo de ordenación por comparación in situ . Puede entenderse como una generalización de la ordenación por intercambio ( ordenación de burbuja ) o por inserción ( ordenación por inserción ). [ 3 ] El método comienza ordenando pares de elementos muy alejados entre sí, y luego reduce progresivamente la distancia entre los elementos que se van a comparar. Al comenzar con elementos alejados, puede mover algunos elementos fuera de lugar a la posición más rápidamente que un simple intercambio de vecinos más cercanos. El tiempo de ejecución de Shellsort depende en gran medida de la secuencia de separación que utiliza. Para muchas variantes prácticas, determinar su complejidad temporal sigue siendo un problema abierto .

El algoritmo fue publicado por primera vez por Donald Shell en 1959 y no tiene nada que ver con conchas. [ 4 ] [ 5 ]

Descripción

Shellsort es una optimización del ordenamiento por inserción que permite el intercambio de elementos muy distantes. La idea es organizar la lista de elementos de manera que, comenzando en cualquier posición, al tomar cada h -ésimo elemento se obtenga una lista ordenada. Dicha lista se denomina h -ordenada. También puede considerarse como h listas intercaladas, cada una ordenada individualmente. [ 6 ] Comenzar con valores grandes de h permite que los elementos se muevan grandes distancias en la lista original, reduciendo rápidamente grandes cantidades de desorden y dejando menos trabajo para los pasos de h -ordenamiento más pequeños. [ 7 ] Si la lista se ordena luego k-ordenada para algún entero k más pequeño , entonces la lista permanece h- ordenada. Un ordenamiento final con h  =  1 asegura que la lista esté completamente ordenada al final, [ 6 ] pero una secuencia decreciente de valores de h elegida con criterio deja muy poco trabajo para esta pasada final.

En términos sencillos, esto significa que si tenemos un array de 1024 números, nuestro primer espacio ( h ) podría ser 512. Luego recorremos la lista comparando cada elemento de la primera mitad con el elemento de la segunda mitad. Nuestro segundo espacio ( k ) es 256, lo que divide el array en cuatro secciones (que comienzan en 0, 256, 512, 768), y nos aseguramos de que los primeros elementos de cada sección estén ordenados entre sí, luego el segundo elemento de cada sección, y así sucesivamente. En la práctica, la secuencia de espacios puede ser cualquiera, pero el último espacio siempre es 1 para finalizar la ordenación (finalizando efectivamente con una ordenación por inserción ordinaria).

A continuación se muestra un ejemplo de ejecución de Shellsort con huecos de 5, 3 y 1.

La primera pasada, 5-sorting, realiza una ordenación por inserción en cinco submatrices separadas ( a 1 , a 6 , a 11 ), ( a 2 , a 7 , a 12 ), ( a 3 , a 8 ), ( a 4 , a 9 ), ( a 5 , a 10 ). Por ejemplo, cambia la submatriz ( a 1 , a 6 , a 11 ) de (62, 17, 25) a (17, 25, 62). La siguiente pasada, 3-sorting, realiza una ordenación por inserción en las tres submatrices ( a 1 , a 4 , a 7 , a 10 ), ( a 2 , a 5 , a 8 , a 11 ), ( a 3 , a 6 , a 9 , a 12 ). La última pasada, la ordenación 1, es una ordenación por inserción ordinaria de todo el array ( a 1 ,..., a 12 ).

Como ilustra el ejemplo, los subconjuntos sobre los que opera Shellsort son inicialmente cortos; posteriormente se vuelven más largos, pero casi ordenados. En ambos casos, el algoritmo de ordenación por inserción funciona de manera eficiente.

A diferencia del algoritmo de ordenación por inserción , Shellsort no es un algoritmo de ordenación estable, ya que las inserciones con huecos desplazan elementos iguales unos sobre otros, perdiendo así su orden original. Es un algoritmo de ordenación adaptativo, puesto que se ejecuta más rápido cuando la entrada está parcialmente ordenada.

Ejemplo

Este es un ejemplo en C# que utiliza la secuencia de huecos de Marcin Ciura, con una ordenación por inserción interna.

usando System.Collections.Generic ;// Ordena un array a[0...n-1]. List < int > gaps = [ 701 , 301 , 132 , 57 , 23 , 10 , 4 , 1 ]; // Secuencia de huecos de Ciura// Comienza con el hueco más grande y ve bajando hasta un hueco de 1 // similar a la ordenación por inserción, pero en lugar de 1, se usa hueco en cada paso foreach ( int hueco in huecos ) { // Realiza una ordenación por inserción con hueco para cada elemento en huecos // Cada bucle deja a[0..hueco-1] en orden con hueco for ( int i = hueco ; i < n ; ++ i ) { // guarda a[i] en temp y crea un hueco en la posición i int temp = a [ i ]; // desplaza los elementos ordenados con hueco anteriormente hasta que se encuentre la ubicación correcta para a[i] for ( int j = i ; ( j >= hueco ) && ( a [ j - hueco ] > temp ); j ​​-= hueco ) { a [ j ] = a [ j - hueco ]; } // coloca temp (el a[i] original) en su ubicación correcta a [ j ] = temp ; } }

Secuencias de huecos

La cuestión de decidir qué secuencia de huecos utilizar es compleja. Cualquier secuencia de huecos que contenga 1 produce una ordenación correcta (ya que esto convierte la pasada final en una ordenación por inserción ordinaria); sin embargo, las propiedades de las versiones de Shellsort obtenidas de esta manera pueden ser muy diferentes. Un número insuficiente de huecos ralentiza las pasadas, y un número excesivo genera una sobrecarga.

La tabla que aparece a continuación compara la mayoría de las secuencias de huecos propuestas y publicadas hasta la fecha. Algunas de ellas tienen elementos decrecientes que dependen del tamaño del arreglo ordenado ( N ). Otras son secuencias infinitas crecientes, cuyos elementos menores que N deben utilizarse en orden inverso.

Cuando la representación binaria de N contiene muchos ceros consecutivos, Shellsort, utilizando la secuencia de huecos original de Shell , realiza Θ( ) comparaciones en el peor de los casos. Por ejemplo, esto ocurre cuando N es una potencia de dos y los elementos mayores y menores que la mediana ocupan posiciones impares y pares, respectivamente, ya que solo se comparan en la última pasada.

La implementación de Shellsort (GBY91) de Gonnet y Baeza-Yates también utiliza huecos que comienzan con N y se desempeña mejor que muchas de las otras secuencias en promedio [ 13 ] , pero también es propensa a un peor caso Θ( N 2 ): Sea X un hueco en la secuencia. La razón común de los huecos de GBY91 de 2.2 permite que al menos dos enteros consecutivos Y e Y+1 sean iguales a X por división entera por 2.2. Elija Y o Y+1, el que sea par, para repetir el proceso, y se obtiene una cadena infinitamente larga de huecos pares > X por inducción. Con X = 1, se generan infinitas opciones para N donde todos los huecos de GBY91 > 1 son pares y por lo tanto son Θ( N 2 ) en la misma entrada del peor caso antes mencionado para los huecos originales de Shell.

Aunque tiene una complejidad mayor que la O ( N  log N ) que es óptima para las ordenaciones por comparación, la versión de Pratt se presta a la ordenación de redes y tiene la misma complejidad de puerta asintótica que el clasificador bitónico de Batcher . 

Gonnet y Baeza-Yates observaron que Shellsort realiza la menor cantidad de comparaciones en promedio cuando las razones de los huecos sucesivos son aproximadamente iguales a 2.2. [ 13 ] Por eso su secuencia con razón 2.2 y la secuencia de Tokuda con razón 2.25 resultan eficientes. Sin embargo, se desconoce la razón de esto. Sedgewick recomienda usar huecos que tengan divisores comunes máximos bajos o que sean coprimos por pares . [ 18 ] Usar huecos que sean números impares parece ayudar: se han visto aceleraciones de alrededor del 25% en la práctica en comparación con el código original de Shell. Usar huecos que no sean múltiplos de 2, 3 o 5 parece reducir aún más los tiempos de ejecución: aceleraciones de alrededor del 35% en comparación con el original de Shell parecen posibles. Usar huecos que sean solo números primos (que terminan en 1) parece producir aceleraciones de alrededor del 40% en comparación con el código original.

Con respecto al número promedio de comparaciones, la secuencia de Ciura [ 15 ] tiene el mejor rendimiento conocido; no se determinaron brechas mayores a 701, pero la secuencia se puede extender aún más según la fórmula recursiva.hk=2.25hk1{\displaystyle h_{k}=\lfloor 2.25h_{k-1}\rfloor }.

La secuencia de Tokuda, definida por la fórmula simplehk=hk{\displaystyle h_{k}=\lceil h'_{k}\rceil }, dóndehk=2.25hk1+1{\displaystyle h'_{k}=2.25h'_{k-1}+1},h1=1{\displaystyle h'_{1}=1}, puede recomendarse para aplicaciones prácticas.

Si el tamaño máximo de entrada es pequeño, como puede ocurrir si Shellsort se utiliza en submatrices pequeñas mediante otro algoritmo de ordenación recursiva como quicksort o merge sort , entonces es posible tabular una secuencia óptima para cada tamaño de entrada. [ 19 ] [ 20 ] Para N = 128 y N = 1000, Ciura encontró empíricamente que (1, 4, 9, 24, 85) y (1, 4, 10, 23, 57, 156, 409, 995) realizaron el menor número de comparaciones en promedio, respectivamente. [ 15 ]

Complejidad computacional

Se cumple la siguiente propiedad: después de ordenar h 2 de cualquier arreglo ordenado h 1 , el arreglo permanece ordenado h 1. [ 21 ] Todo arreglo ordenado h 1 y ordenado h 2 también está ordenado ( a 1 h 1 + a 2 h 2 ), para cualesquiera enteros no negativos a 1 y a 2 . La complejidad del peor caso de Shellsort está, por lo tanto, relacionada con el problema de Frobenius : para enteros dados h 1 ,..., h n con mcd = 1, el número de Frobenius g ( h 1 ,..., h n ) es el mayor entero que no puede representarse como a 1 h 1 + ... + a n h n con entero no negativo a 1 ,..., a n . Usando fórmulas conocidas para los números de Frobenius, podemos determinar la complejidad del peor caso de Shellsort para varias clases de secuencias de huecos. [ 22 ] Los resultados probados se muestran en la tabla anterior.

Mark Allen Weiss demostró que Shellsort se ejecuta en tiempo O ( N log N ) cuando el array de entrada está en orden inverso. [ 23 ]

Con respecto al número promedio de operaciones, ninguno de los resultados probados se refiere a una secuencia de brechas práctica. Para brechas que son potencias de dos, Espelid calculó este promedio como0,5349nortenorte0,4387norte0,097norte+O(1){\displaystyle 0.5349N{\sqrt {N}}-0.4387N-0.097{\sqrt {N}}+O(1)}. [ 24 ] Knuth determinó que la complejidad promedio de ordenar una matriz de N elementos con dos huecos ( h , 1) es2norte2h+πnorte3h{\displaystyle {\frac {2N^{2}}{h}}+{\sqrt {\pi N^{3}h}}}. [ 3 ] De ello se deduce que un Shellsort de dos pasadas con h = Θ( N 1/3 ) realiza en promedio O ( N 5/3 ) comparaciones/inversiones/tiempo de ejecución. Yao halló la complejidad promedio de un Shellsort de tres pasadas. [ 25 ] Su resultado fue refinado por Janson y Knuth: [ 26 ] el número promedio de comparaciones/inversiones/tiempo de ejecución realizado durante un Shellsort con tres huecos ( ch , cg , 1), donde h y g son coprimos, esnorte24doh+O(norte){\displaystyle {\frac {N^{2}}{4ch}}+O(N)}en el primer pase,18gramoπdoh(h1)norte3/2+O(hnorte){\displaystyle {\frac {1}{8g}}{\sqrt {\frac {\pi }{ch}}}(h-1)N^{3/2}+O(hN)}en el segundo pase yψ(h,gramo)norte+18πdo(do1)norte3/2+O((do1)gramoh1/2norte)+O(do2gramo3h2){\displaystyle \psi (h,g)N+{\frac {1}{8}}{\sqrt {\frac {\pi }{c}}}(c-1)N^{3/2}+O\left((c-1)gh^{1/2}N\right)+O\left(c^{2}g^{3}h^{2}\right)}en el tercer paso. ψ ( h , g ) en la última fórmula es una función complicada asintóticamente igual aπh128gramo+O(gramo1/2h1/2)+O(gramoh1/2){\displaystyle {\sqrt {\frac {\pi h}{128}}}g+O\left(g^{-1/2}h^{1/2}\right)+O\left(gh^{-1/2}\right)}. En particular, cuando h = Θ( N 7/15 ) y g = Θ( N 1/5 ), el tiempo promedio de clasificación es O ( N 23/15 ).

Basándose en experimentos, se conjetura que Shellsort con la secuencia de huecos de Hibbard se ejecuta en un tiempo promedio de O ( N 5/4 ), [ 3 ] y que la secuencia de Gonnet y Baeza-Yates requiere en promedio 0,41 N  ln N (ln ln N + 1/6) movimientos de elementos. [ 13 ] Las aproximaciones del número promedio de operaciones presentadas anteriormente para otras secuencias fallan cuando los arreglos ordenados contienen millones de elementos.      

El gráfico a continuación muestra el número promedio de comparaciones de elementos utilizadas por varias secuencias de huecos, dividido por el límite inferior teórico , es decir, log 2 N !. La secuencia de Ciuria 1, 4, 10, 23, 57, 132, 301, 701 (etiquetada como Ci01) se ha extendido según la fórmulahk=2.25hk1{\displaystyle h_{k}=\lfloor 2.25h_{k-1}\rfloor }.

Aplicando la teoría de la complejidad de Kolmogorov , Jiang, Li y Vitányi [ 27 ] demostraron la siguiente cota inferior para el orden del número promedio de operaciones/tiempo de ejecución en un Shellsort de p pasadas: Ω( pN 1 +1/ p ) cuando p  log₂N y Ω( pN ) cuando p > log₂N . Por lo tanto, Shellsort tiene perspectivas de ejecutarse en un tiempo promedio que crece asintóticamente como N log N solo cuando se utilizan secuencias de huecos cuyo número de huecos crece en proporción al logaritmo del tamaño del arreglo. Sin embargo, se desconoce si Shellsort puede alcanzar este orden asintótico de complejidad en el caso promedio, que es óptimo para los algoritmos de ordenación por comparación. La cota inferior fue mejorada por Vitányi [ 28 ] para cada número de pasadas.  pag{\displaystyle p}a Ω(nortek=1paghk1/hk){\displaystyle \Omega (N\sum _{k=1}^{p}h_{k-1}/h_{k})} dóndeh0=norte{\displaystyle h_{0}=N}. Este resultado implica, por ejemplo, la cota inferior de Jiang-Li-Vitányi para todospag{\displaystyle p}-pasa secuencias de incremento y mejora ese límite inferior para secuencias de incremento particulares. De hecho, todos los límites (inferiores y superiores) actualmente conocidos para el caso promedio coinciden precisamente con este límite inferior. Por ejemplo, esto da el nuevo resultado de que el límite superior de Janson-Knuth coincide con el límite inferior resultante para la secuencia de incremento utilizada, lo que demuestra que Shellsort de tres pasadas para esta secuencia de incremento utilizaΘ(norte23/15){\displaystyle \Theta (N^{23/15})}comparaciones/inversiones/tiempo de ejecución. La fórmula nos permite buscar secuencias de incrementos que produzcan límites inferiores desconocidos; por ejemplo, una secuencia de incrementos para cuatro pasadas que tenga un límite inferior mayor que Ω(pagnorte1+1/pag)=Ω(norte5/4){\displaystyle \Omega (pn^{1+1/p})=\Omega (n^{5/4})}para la secuencia de incremento h1=norte11/16,{\displaystyle h_{1}=n^{11/16},}h2=norte7/16,{\displaystyle h_{2}=n^{7/16},}h3=norte3/16,{\displaystyle h_{3}=n^{3/16},}h4=1{\displaystyle h_{4}=1}El límite inferior se convierte en T=Ω(norte(norte111/16+norte11/167/16+norte7/163/16+norte3/16)=Ω(norte1+5/16)=Ω(norte21/16).{\displaystyle T=\Omega (n\cdot (n^{1-11/16}+n^{11/16-7/16}+n^{7/16-3/16}+n^{3/16})=\Omega (n^{1+5/16})=\Omega (n^{21/16}).}

La complejidad en el peor de los casos de cualquier versión de Shellsort es de orden superior: Plaxton, Poonen y Suel demostraron que crece al menos tan rápidamente comoΩ(norte(registronorteregistroregistronorte)2){\displaystyle \Omega \left(N\left({\log N \over \log \log N}\right)^{2}\right)}. [ 29 ] [ 30 ] Robert Cypher demostró una cota inferior más fuerte:Ω(norte(registronorte)2registroregistronorte){\displaystyle \Omega \left(N{{(\log N)^{2}} \over {\log \log N}}\right)}cuandohs+1>hs{\displaystyle h_{s+1}>h_{s}}a pesar des{\displaystyle s}. [ 31 ]

Aplicaciones

Shellsort realiza más operaciones y tiene una tasa de fallos de caché mayor que quicksort . Sin embargo, dado que se puede implementar con poco código y no utiliza la pila de llamadas , algunas implementaciones de la función qsort en la biblioteca estándar de C destinadas a sistemas embebidos la utilizan en lugar de quicksort. Shellsort se utiliza, por ejemplo, en la biblioteca uClibc . [ 32 ] Por razones similares, en el pasado, Shellsort se utilizó en el kernel de Linux . [ 33 ]

Shellsort también puede servir como subalgoritmo de ordenación introspectiva para ordenar submatrices cortas y evitar una ralentización cuando la profundidad de recursión supera un límite determinado. Este principio se emplea, por ejemplo, en el compresor bzip2 . [ 34 ]

Véase también

Referencias

  1. 1 2 3 Pratt, Vaughan Ronald (1979). Shellsort and Sorting Networks (Disertaciones destacadas en ciencias de la computación) (PDF) . Garland. ISBN 978-0-8240-4406-0Archivado (PDF) del original el 7 de septiembre de 2021 .
  2. "Shellsort y comparaciones" . Archivado del original el 20 de diciembre de 2019. Consultado el 14 de noviembre de 2015 .
  3. 1 2 3 4 5 Knuth, Donald E. (1997). «El método de Shell». El arte de la programación informática. Volumen 3: Ordenación y búsqueda (2.ª ed.). Reading, Massachusetts: Addison-Wesley. págs. 83–95 . ISBN   978-0-201-89685-5.
  4. 1 2 Shell, DL (1959). "Un procedimiento de clasificación de alta velocidad" (PDF) . Communications of the ACM . 2 (7): 30– 32. doi : 10.1145/368370.368387 . S2CID 28572656. Archivado del original (PDF) el 30 de agosto de 2017. Recuperado el 18 de octubre de 2011 . 
  5. Algunos libros de texto y referencias antiguos denominan a esto clasificación "Shell-Metzner" en honor a Marlene Metzner Norton , pero según Metzner, "no tuve nada que ver con la clasificación, y mi nombre nunca debió haber sido asociado a ella". Véase "Clasificación Shell" . Instituto Nacional de Estándares y Tecnología . Consultado el 17 de julio de 2007 .
  6. 1 2 3 Sedgewick, Robert (1998). Algoritmos en C. Vol. 1 (3.ª ed.). Addison-Wesley. págs. 273–281 . ISBN    978-0-201-31452-6.
  7. Kernighan, Brian W.; Ritchie , Dennis M. (1996). El lenguaje de programación C (2.ª ed.). Prentice Hall. pág. 62. ISBN   978-7-302-02412-5.
  8. Frank, RM; Lazarus, RB (1960). "Un procedimiento de clasificación de alta velocidad" . Communications of the ACM . 3 (1): 20– 22. doi : 10.1145/366947.366957 . S2CID 34066017 . 
  9. Hibbard, Thomas N. (1963). "Un estudio empírico de la clasificación de almacenamiento mínimo" . Communications of the ACM . 6 (5): 206– 213. doi : 10.1145/366552.366557 . S2CID 12146844 . 
  10. Papernov, AA; Stasevich, GV (1965). "Un método de clasificación de información en memorias de computadora" (PDF) . Problemas de transmisión de información . 1 (3): 63– 75.
  11. Incerpi, Janet; Sedgewick, Robert (1985). "Improved Upper Bounds on Shellsort" (PDF) . Journal of Computer and System Sciences . 31 (2): 210– 224. doi : 10.1016/0022-0000(85)90042-x .
  12. Sedgewick, Robert (1986). "Un nuevo límite superior para Shellsort". Journal of Algorithms . 7 (2): 159– 173. doi : 10.1016/0196-6774(86)90001-5 .
  13. 1 2 3 4 Gonnet, Gaston H.; Baeza-Yates, Ricardo (1991). "Shellsort". Manual de algoritmos y estructuras de datos: en Pascal y C (2.ª ed.). Reading, Massachusetts: Addison-Wesley. págs. 161–163 . ISBN   978-0-201-41607-7Numerosos experimentos indican que la secuencia definida por α = 0,45454 < 5/11 tiene un rendimiento significativamente mejor que otras secuencias. La forma más sencilla de calcular 0,45454 n es mediante aritmética de enteros.(5 * n — 1)/11
  14. Tokuda, Naoyuki (1992). «Un Shellsort mejorado». En van Leeuven, Jan (ed.). Actas del 12.º Congreso Mundial de Informática de la IFIP sobre Algoritmos, Software y Arquitectura . Ámsterdam: North-Holland Publishing Co., págs. 449-457 . ISBN  978-0-444-89747-3.
  15. 1 2 3 Ciura, Marcin (2001). "Mejores incrementos para el caso promedio de Shellsort" (PDF) . En Freiwalds, Rusins ​​(ed.). Actas del 13.º Simposio Internacional sobre Fundamentos de la Teoría de la Computación . Londres: Springer-Verlag. pp. 106–117 . ISBN  978-3-540-42487-1Archivado del original (PDF) el 23 de septiembre de 2018.
  16. Lee, Ying Wai (21 de diciembre de 2021). "Secuencia de brechas de Tokuda mejorada empíricamente en Shellsort". arXiv : 2112.11112 [ cs.DS ].
  17. Skean, Oscar; Ehrenborg, Richard; Jaromczyk, Jerzy W. (1 de enero de 2023). "Perspectivas de optimización en Shellsort". arXiv : 2301.00316 [ cs.DS ].
  18. Sedgewick, Robert (1998). "Shellsort". Algorithms in C++, Parts 1–4: Fundamentals, Data Structure, Sorting, Searching . Reading, Massachusetts: Addison-Wesley. pp. 285–292 . ISBN  978-0-201-35088-3.
  19. Forshell, Olof (22 de mayo de 2018). "¿Cómo elegir las longitudes de mis subsecuencias para una ordenación shell?" . Stack Overflow . Comentarios adicionales en ¿ Secuencia de huecos más rápida para la ordenación de shell? (23 de mayo de 2018).
  20. Lee, Ying Wai (21 de diciembre de 2021). "Secuencias de huecos óptimas en Shellsort para n ≤ 16 elementos". arXiv : 2112.11127 [ math.CO ].
  21. Gale, David ; Karp, Richard M. (abril de 1972). "Un fenómeno en la teoría de la ordenación" (PDF) . Journal of Computer and System Sciences . 6 (2): 103– 115. doi : 10.1016/S0022-0000(72)80016-3 .
  22. Selmer, Ernst S. (marzo de 1989). "Sobre Shellsort y el problema de Frobenius" (PDF) . BIT Numerical Mathematics . 29 (1): 37–40 . doi : 10.1007/BF01932703 . hdl : 1956/19572 . S2CID 32467267. Archivado del original (PDF) el 3 de marzo de 2022. 
  23. ^ Weiss, Mark Allen (1989). "Un buen caso para Shellsort". Congreso Numerantium . 73 : 59-62 .
  24. Espelid, Terje O. (diciembre de 1973). "Análisis de un algoritmo Shellsort". BIT Numerical Mathematics . 13 (4): 394– 400. doi : 10.1007/BF01933401 . S2CID 119443598 .  El resultado citado es la ecuación (8) en la página 399.
  25. Yao, Andrew Chi-Chih (1980). "An Analysis of ( h , k , 1)-Shellsort" (PDF) . Journal of Algorithms . 1 (1): 14– 50. doi : 10.1016/0196-6774(80)90003-6 . S2CID 3054966. STAN-CS-79-726. Archivado del original (PDF) el 4 de marzo de 2019. 
  26. Janson, Svante ; Knuth, Donald E. (1997). "Shellsort with Three Increments" (PDF) . Random Structures and Algorithms . 10 ( 1–2 ): 125–142 . arXiv : cs/9608105 . CiteSeerX 10.1.1.54.9911 . doi : 10.1002/(SICI)1098-2418(199701/03)10:1/2 < 125::AID-RSA6 > 3.0.CO ; 2-X . 
  27. ^ Jiang, Tao; Li, Ming ; Vitányi, Paul (septiembre de 2000). "Un límite inferior en la complejidad promedio de Shellsort" (PDF) . Revista de la ACM . 47 (5): 905–911 . arXiv : cs/9906008 . CiteSeerX 10.1.1.6.6508 . doi : 10.1145/355483.355488 . S2CID 3265123 .  
  28. Vitányi, Paul (marzo de 2018). "Sobre la complejidad del caso promedio de Shellsort" (PDF) . Random Structures and Algorithms . 52 (2): 354–363 . arXiv : 1501.06461 . doi : 10.1002/rsa.20737 . S2CID 6833808 . 
  29. Plaxton, C. Greg; Poonen, Bjorn ; Suel, Torsten (24–27 de octubre de 1992). «Límites inferiores mejorados para Shellsort» (PDF) . Actas del 33.er Simposio Anual sobre Fundamentos de la Informática . Vol. 33. Pittsburgh, Estados Unidos. págs. 226–235 . CiteSeerX 10.1.1.43.1393 . doi : 10.1109/SFCS.1992.267769 . ISBN    978-0-8186-2900-6. S2CID 15095863 . {{cite book}}: CS1 mantenimiento: falta el editor de ubicación ( enlace )
  30. Plaxton, C. Greg; Suel, Torsten (mayo de 1997). "Límites inferiores para Shellsort" (PDF) . Journal of Algorithms . 23 (2): 221– 240. CiteSeerX 10.1.1.460.2429 . doi : 10.1006/jagm.1996.0825 . 
  31. Cypher, Robert (1993). "Un límite inferior para el tamaño de las redes de ordenación Shellsort". SIAM Journal on Computing . 22 : 62–71 . doi : 10.1137/0222006 .
  32. Novoa, Manuel III. "libc/stdlib/stdlib.c" . Consultado el 29 de octubre de 2014 .
  33. "kernel/groups.c" . GitHub . Consultado el 5 de mayo de 2012 .
  34. Julian Seward. "bzip2/blocksort.c" . Consultado el 30 de marzo de 2011 .

Bibliografía

  • Algoritmos de ordenación animados: Shell Sort en Wayback Machine (archivado el 10 de marzo de 2015) – demostración gráfica
  • Shellsort con huecos 5, 3, 1 como una danza folclórica húngara