Es una mejora del mtodo de insercin directa que se utiliza cuando el nmero de
elementos a ordenar es grande. El mtodo se denomina "shell" -en honor de su inventor
Donald shell - y tambin mtodo de insercin con incrementos decrecientes.
En el mtodo de clasificacin por insercin, cada elemento se compara con los
elementos contiguos de su izquierda, uno tras otro. Si el elemento a insertar es ms pequeo
- por ejemplo -, hay que ejecutar muchas comparaciones antes de colocarlo en su lugar
definitivamente. Shell modifico los saltos contiguos resultantes de las comparaciones por
saltos de mayor tamao y con eso se consegua la clasificacin ms rpida. El mtodo se
basa en fijar el tamao de los saltos constantes, pero de mas de una posicin.
Supongamos un vector de elementos
4 12 16 24 36 3
En el mtodo de insercin directa, los saltos se hacen de una posicin en una posicin
y se necesitaran cinco comparaciones. En el mtodo de Shell, si los saltos son de dos
posiciones, se realizaran comparaciones.
4 12 16 24 36 3
Ejemplo:
Deducir las secuencias parciales de clasificacin por el mtodo de Shell para ordenar
en ascendente la lista o vector.
6, 1, 5, 2, 3, 4, 0
2 3 0,1,4,2,3,5,6 (2,0)
3 3 0,1,4,2,3,5,6 NINGUNO
4 1 0,1,2,3,4,5,6 (4,2),(4,3)
5 1 0,1,2,3,4,5,6 NINGUNO
Sea un vector X:
X[1], X[2], X[3], X[N]
Y consideremos el primer salto a dar que tendr un valor de N/2
Por lo que, para reordenar, se tomara parte entera. N DIV 2
Y iguala a salto Salto = N DIV 2
A: 15 67 08 16 44 27 12 35 56 21 13 28 60 36 07 10
PRIMER PASADA
La ordenacin produce:
A: 15 21 08 16 44 27 07 10 56 67 13 28 60 36 12 35
SEGUNDA PASADA
A: 15 21 07 10 44 27 08 16 56 36 12 28 60 67 13 35
TERCERA PASADA
La ordenacin produce:
A: 07 10 08 16 12 21 13 27 15 28 44 35 56 36 60 67
CUARTA PASADA
La ordenacin produce:
A: 07 08 10 12 13 15 16 21 27 28 35 36 44 56 60 67
METODO QUICKSORT.
El metodo de ordenamiento es actualmente el mas eficiente y veloz de los metodos de
ordenamiento interna. Es tambien conocido como metodo rapido y de ordenacion por
paticion. Este metodo es una mejora sustacial del metodo de intercambio directo y se
denomina quicksort.
Idea central:
1. Se toma un elemento X de una posicion cualquiera del arreglo.
2. Se trata ubicar a X en la posicion correcta del arreglo, de tal forma que todos los
elementos que se encuentren a su derecha sean mayor o iguales a X.
3. Se repite los pasos anteriores, pero ahora para los conjuntos de datos que se
encuentran a la izquierda y a la derecha de la posicion de X en el arreglo.
4. El proceso termina cuando todos los elementos se encuentran en su posicion correcta
en el arreglo.
La esencia del mtodo consiste en clasificar un arreglo A[1] A[n] tomando en el
arreglo un valor clave V como elemento pivote, alrededor del cual reorganizar los elementos
del arreglo. Es de esperar que el pivote este cercano al valor medio de la clave del arreglo,
de forma que este precedido por una mitad de las claves y seguido por la otra mitad. Se
permutan los elementos del arreglo con el fin de que para alguna J. todos los registros con
claves menores que V aparezcan en A[1] A[J], y todos aquellos con claves v o mayores
aparezcan en A[j + 1] A[n]. Despus, se aplica recursivamente la clasificacin rpida a A[1]
A[j] y a A[j + 1] A[n] para clasificar ambos grupos de elementos. Dado que todas las
claves del primer grupo preceden a todas las claves del segundo grupo, todas las claves del
primer grupo preceden a todas las claves del segundo grupo, todo el arreglo quedara
ordenado.
A continuacin de muestran los pasos recursivos que la clasificacin rpida puede
realizar para clasificar la secuencia de enteros 3, 1, 4, 1, 5, 9, 2, 6, 5, 3. En cada caso se ha
escogido como valor V al mayor de los dos valores distintos que se encuentran mas a la
izquierda. La recursin termina al descubrir que la porcin del arreglo que se deb clasificar
consta de claves idnticas. Se ha mostrado que cada nivel consta de dos pasos, uno antes
de dividir cada subarreglo y el segundo, despus. La reorgaizacion de los registroz.
El procedimiento recursivo quicksort(i, j) que opera en un arreglo A con elementos A[1]
A[n], definido de manera externa al preocedimeinto. Quicksort(i , j) ordena desde A[i] A[j]
en el mismo lugar.
Se empieza desarrollando una funcin encuentra_pivote no encuentra dos claves
distintas, devuelve 0. De otro modo devuelve el ndice de la mayor de las dos primeras
claves diferentes la cual se convierte el ndice de la mayor de las dos primeras claves
diferentes la cual se convierte en el elemento pivote.
Rpido_recursivo_(A, N)
Llamar a Reduce_recursivo(1, N)
Fin
Reduce_recursivo(INI, FIN)
Hacer IZQ INI, DER FIN, POS INI y BAND VERDADERO
Mientras (BAND= VERDADERO) Repetir
Hacer BAND FALSO
Mientras ((A[POS]<=A[DER]) y (POS DER)) Repetir
Hacer DER DER-1
Fin Mientras
Si (POS DER)
Entonces
Hacer Aux A[POS], A[POS] A[DER], A[DER] Aux
Hacer Aux M[POS], M[POS] M[DER], M[DER] Aux
Hacer Aux C[POS], C[POS] C[DER], C[DER] Aux
Hacer POS DER
Mientras ((A[POS]>=A[IZQ]) y (POS IZQ)) Repetir
Hacer IZQ IZQ+1
Fin Mientras
Si (POS IZQ)
Entonces
Hacer BAND VERDADERO
Hacer AuxA[POS],A[POS]A[IZQ],A[IZQ]Aux
Hacer AuxM[POS],M[POS]M[IZQ],M[IZQ]Aux
Hacer AuxC[POS],C[POS]C[IZQ],C[IZQ]Aux
Hacer POS IZQ
Fin Si
Fin Si
Fin Mientras
Si ((POS-1)> INI)
Entonces
Regresar a Reduce_recursivo(INI, (POS-1))
Fin Si
Si (FIN > (POS+1))
Entonces
Regresar a Reduce_recursivo((POS+1), FIN)
Fin Si
Fin