El Shell clasifica es un algoritmo de clasificación que es una generalización de la clase de inserción, con dos observaciones:
la clase de inserción es eficiente si la entrada es " casi sorted", y
la clase de inserción es típicamente ineficaz porque mueve valores apenas una posición a la vez.
La puesta en práctica original realiza comparaciones e intercambios O ( n 2) en el peor caso. Un cambio de menor importancia dado en libro del V. Pratt mejoró el límite a O ( n del n log2). Esto es peor que las clases óptimas de la comparación que son O ( n del registro del n ).
Shell clasifica mejora clase de inserción comparando los elementos separados por un boquete de varias posiciones. Esto deja un elemento tomar el " un steps" más grande; hacia su posición prevista. Los pasos múltiples sobre los datos se toman con tamaños de boquete más pequeños y más pequeños. El paso pasado de la clase de Shell es una clase de inserción llana, pero para entonces, el arsenal de datos se garantiza casi para ser clasificado.
Considerar un pequeño valor que se almacene inicialmente en el final incorrecto del arsenal . Usar una clase de O ( n 2) tal como clase de burbuja o clase de inserción, tomará áspero comparaciones e intercambios del n para mover este valor hasta el final al otro final del arsenal. Shell clasifica primero mueve valores usar tamaños de paso gigante, así que un pequeño valor moverá una manera larga hacia su posición final, con apenas algunas comparaciones e intercambios.
Uno puede visualizar Shellsort así: arreglar la lista en una tabla y clasificar las columnas (usar una clase de inserción ). Repetir este proceso, cada vez con un número más pequeño de columnas más largas. En el extremo, la tabla tiene solamente una columna. Mientras que la transformación de la lista en una tabla hace más fácil visualizar, el algoritmo sí mismo hace su clasificación sobre el terreno (incrementando el índice por el tamaño de paso, es decir usar el i += step_size en vez de i++).
Por ejemplo, considerar una lista de números como el 13 14 94 33 82 25 59 94 65 23 45 27 73 25 39 10 . Si comenzamos con un paso-tamaño de 5, podríamos visualizar esto como fractura de la lista de números en una tabla con 5 columnas. Esto parecería esto:
13 14 94 33 82 25 59 94 65 23 45 27 73 25 39 10
Entonces clasificamos cada columna, que nos da
10 14 73 25 23 13 27 94 33 39 25 59 94 65 82 45
Cuando están releídos como sola lista de números, conseguimos a 10 14 73 25 23 13 27 94 33 39 25 59 94 65 82 45 . Aquí, los 10 que estaba hasta el final en el extremo, se ha movido hasta el final al principio. Esta lista entonces se clasifica otra vez usar una clase de 3 boquetes, y entonces 1 clase del boquete (clase de inserción simple).
La secuencia del boquete que fue sugerida original por el Donald Shell era comenzar con y partir en dos el número hasta que alcance 1. Mientras que esta secuencia proporciona realces significativos del funcionamiento sobre los algoritmos cuadráticos tales como clase de inserción, puede ser cambiada levemente para disminuir más lejos los tiempos en marcha medios y a lo peor. El libro de textos de Weiss demuestra que esta secuencia permite un , si los datos están inicialmente en el arsenal como (small_1, large_1, small_2, large_2,…) - es decir, la mitad superior de los números se pone, en orden clasificada, en incluso las localizaciones del índice y el extremo inferior de los números se pone semejantemente en las localizaciones puestas en un índice impares.
Quizás la característica más crucial de Shellsort es que los elementos siguen k-clasificados incluso durante el boquete disminuye. Por ejemplo, si una lista era 5 clasificados y entonces 3 clasificados, la lista ahora es no sólo 3 clasificados, pero 5 - y 3 clasificados. Si esto no fuera verdad, el algoritmo desharía el trabajo que había hecho en iteraciones anteriores, y no alcanzaría un tiempo en marcha tan bajo.
Dependiendo de la opción de la secuencia del boquete, Shellsort tiene un tiempo en marcha a lo peor probado del (usar los incrementos de Shell que comienzan con el 1/2 el tamaño del arsenal y dividen por 2 cada vez), (usar los incrementos de Hibbard de ), (usar los incrementos de Sedgewick de , o ), o el , y posiblemente los mejores tiempos en marcha sin probar. La existencia de un de Shellsort fueron imposibilitadas por Poonen, Plaxton, y Suel.
La secuencia más conocida es 1, 4, 10, 23, 57, 132, 301, 701. Tal Shell clasifica es más rápido que una clase de inserción y una clase de montón, pero si es más rápida que un Quicksort para los pequeños órdenes (menos de 50 elementos), él es más lento para órdenes más grandes. Después de 701, los boquetes en que la progresión geométrica puede ser computada utilizaron, por ejemplo: nextgap = redondo (boquete * 2.3)
lang=c> del
.
| Random links: | Henry Bonilla | Alta tarjeta por el juego (póker) | 1995-1999 de la duración del mandato del gobierno de Cataluña | Hiperactividad | Localizaciones de Alabama por renta per cápita |