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.

Historia

Shell clasifica se nombra después de su inventor, el Donald Shell, que publicó el algoritmo en 1959. Algunos más viejos libros de textos y referencias llaman esto el " Cáscara-Metzner" clase después Marlene Metzner Norton, pero según Metzner, " No tenía nada hacer con la clase, y mi nombre se debe nunca haber atado a it."

Puesta en práctica

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).

Gap ordena

La secuencia del boquete del es una parte integrante del algoritmo del shellsort. Cualquier secuencia del incremento trabajará, siempre y cuando el elemento pasado es 1. El algoritmo comienza realizando una clase de inserción del boquete del, con el boquete siendo el primer número en la secuencia del boquete. Continúa realizando una clase de inserción del boquete para cada número en la secuencia, hasta que acabe con un boquete de 1. Cuando el boquete es 1, la clase de inserción del boquete es simplemente una clase de inserción ordinaria, garantizando que la lista final está clasificada.

La secuencia del boquete que fue sugerida original por el Donald Shell era comenzar con N/2 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 O del peor caso (clase de n^2), 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 O (n^2) (usar los incrementos de Shell que comienzan con el 1/2 el tamaño del arsenal y dividen por 2 cada vez), O (n^ {3/2}) (usar los incrementos de Hibbard de 2^k-1), O (n^ {4/3}) (usar los incrementos de Sedgewick de 9 (4^i) - 9 (2^i) + 1, o 4^ {i+1} + 3 (2^i) + 1), o el O (n \ log^2 n), y posiblemente los mejores tiempos en marcha sin probar. La existencia de un O (n \ la puesta en práctica a lo peor del registro n) 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)

Algoritmo de clase de Shell en C/C++

Lo que sigue es una puesta en práctica de la clase de la cáscara escrita en el C / C++ para clasificar un arsenal de números enteros. La secuencia del incremento usada en este código del ejemplo da un tiempo en marcha a lo peor O (n2).

lang=c> del vacío (tamaño de la internacional A, de la internacional) {internacional i, j, incremento, temp; incremento = tamaño/2; mientras que (incremento > 0) {para (i = incremento; i < tamaño; i++) {j = i; temp = A; mientras que ((&& del incremento del >= de j) (A > temp)) {A = A - incremento; j = j - incremento; } A = temp; } si (== del incremento 2) incremento = 1; incremento = (internacional) (incremento/2.2); } }

Algoritmo de clase de Shell en Java

Una puesta en práctica de Java de la clase de Shell es como sigue: lang=java> del público (internacional a) { para (incremento de la internacional = a.length/2; incremento > 0; ¿incremento = (== 2 del incremento? 1: (internacional) Math.2))) { para (internacional i = incremento; i < a.length; i++) { para (internacional j = i; && a - incremento > a del incremento del >= de j; j - = incremento) { temp de la internacional = a; a = a - incremento; a - incremento = temp; } } } }

Algoritmo de clase de Shell en pitón

lang=python> del para el incremento en el new_increment (a): para i en xrange (el incremento, len (a)): para j en el xrange (i, increment-1, - incremento): si a - incremento < a: rotura temp = a; a = a - incremento a - incremento = temp volver a

.

  • Zenithic
  • Sutton Parkway railway station
    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

  • © 2007-2008 enciclopediaespana.com; article text available under the terms of GFDL, from en.wikipedia.org
    ="http://pagead2.googlesyndication.com/pagead/show_ads.js">