Anda di halaman 1dari 14

ALUMNO: LUIS ENRIQUE GUZMAN USCANGA.

MANUEL YAIR VILLANUEVA ALARCON.

CATEDRATICO: LUIS BERNARDO BALLESTERO BARRADAS

ESPECIALIDAD: ING. SISTEMAS COMPUTACIONALES

TEMA: METODO SHELL Y QUICKSORT

MATERIA: ESTRUCTURA DE DATOS


METODO DE SHELL

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

El mtodo se basa en tomar como salto N/2 (siendo N el numero de elementos) y


luego reduciendo a la mitad en cada repeticin hasta que el salto o distancia vale 1
Considerando la variable salto, se tendra para el caso de un determinado vector X los
siguientes recorridos:

Vector X [X[1], X[3], ,X[N]]


Vector X1 [X[1], X[1] + salto, X[2], ]
Vector XN [salto1, salto2, salto3, ]

El mtodo de ordenamiento por seleccin consiste en encontrar el menor de todos los


elementos del arreglo e intercambiarlo con el que est en la primera posicin. Luego el
segundo mas pequeo, y as sucesivamente hasta ordenar todo el arreglo.

Procedimiento Selection Sort


paso 1: [Para cada pos. del arreglo] For i <- 1 to N do
paso 2: [Inicializa la pos. del menor] menor <- i
paso 3: [Recorre todo el arreglo] For j <- i+1 to N do
paso 4: [Si a[j] es menor] If a[j] < a[menor] then
paso 5: [Reasigna el apuntador al menor] min = j
paso 6: [Intercambia los datos de la pos.
min y posicin i] Swap(a, min, j).
paso 7: [Fin] End.
Ejemplo:
El arreglo a ordenar es a = ['a','s','o','r','t','i','n','g','e','x','a','m','p','l','e'].
Se empieza por recorrer el arreglo hasta encontrar el menor elemento. En este caso el
menor elemento es la primera 'a'. De manera que no ocurre ningn cambio. Luego se
procede a buscar el siguiente elemento y se encuentra la segunda 'a'.
Esta se intercambia con el dato que est en la segunda posicin, la 's', quedando el
arreglo as despus de dos recorridos: a = ['a','a','o','r','t','i','n','g','e','x','s','m','p','l','e'].
El siguiente elemento, el tercero en orden de menor mayor es la primera 'e', la cual se
intercambia con lo que est en la tercera posicin, o sea, la 'o'. Le sigue la segunda 's', la
cual es intercambiada con la 'r'.
El arreglo ahora se ve de la siguiente manera: a =
['a','a','e','e','t','i','n','g','o','x','s','m','p','l','r'].
De esta manera se va buscando el elemento que debe ir en la siguiente posicin hasta
ordenar todo el arreglo.
El nmero de comparaciones que realiza este algoritmo es :
Para el primer elemento se comparan n-1 datos, en general para el elemento i-simo
se hacen n-i comparaciones, por lo tanto, el total de comparaciones es:
la sumatoria para i de 1 a n-1 (n-i) = 1/2 n (n-1).

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

RECORRIDO SALTO LISTA INTERCAMBIO


REORDENADA

1 3 2,1,4,5,0,3,5,6 (6,2), (5,4), (6,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

Private Sub Command1_Click()


Dim l(1 To 20), salto As Integer
n = InputBox("digite el nmero elementos de la lista", "control de entrada")
For i = 1 To n
l(i) = InputBox("digite el nmero", "control de entrada")
Next i
salto = n / 2
While salto > 0
For i = (salto + 1) To n
j = i - salto
While j > 0
k = j + salto
If l(j) <= l(k) Then
j=0
Else
aux = l(j)
l(j) = l(k)
l(k) = aux
End If
j = j salto
Wend
Next i
salto = salto / 2
Wend
For i = 1 To n
Print l(i)
Next i
End Sub
EJEMPLO GRAFICO

Supngase que se desean ordenar los elementos que se encuentran en el arreglo A


utilizando el mtodo shell.

A: 15 67 08 16 44 27 12 35 56 21 13 28 60 36 07 10

PRIMER PASADA

Se dividen los elementos en 8 grupos:

La ordenacin produce:

A: 15 21 08 16 44 27 07 10 56 67 13 28 60 36 12 35

SEGUNDA PASADA

Se dividen los elementos en 4 grupos:


La ordenacin produce:

A: 15 21 07 10 44 27 08 16 56 36 12 28 60 67 13 35

TERCERA PASADA

Se dividen los elementos en 2 grupos:

La ordenacin produce:

A: 07 10 08 16 12 21 13 27 15 28 44 35 56 36 60 67

CUARTA PASADA

Dividimos los elementos en un solo grupo:

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.

Para realizarlo, se introduce dos cursores, Z y D, en un principio, en los extremos


izquierdos y derechos, respectivamente, de la porcin de A que esta clasifiando. Los
elementos a la izquierda de Z, esto es A[i] A[Z - 1], siempre tendr claves menores que el
pivote. Los elementos a la derecha de D, A[D + 1] A[j], tendr claves mayores o iguales al
pivote, y los elelmntos del centro estarn mezclados, como se sugiere.
1. Rastrear. Mueve Z a la derecha en los registros cuyas claves sean menores que el
pivote. Mueve D a la izquierda en las claves mayores o iguales que pivote. (esta
seleccin del pivote por encuentra_pivote garantiza que por lo menos existe una clave
menor y una no menor que el pivote, de modo que Z y D con seguridad se detendr
antes de quedar fuera del intervalo i y j).
2. Probar. Si Z > D (lo que en la practica significa que Z = D + 1), entoces se h dividido
A[i] A[j] en forma satisfacria, lo cual basta.
3. Desviar. Si Z < D (observec que no se puede parar durante el rastreo con Z=D, porque
uno u otro se mover mas alla de una clave dada), se intercambia A[Z] con A[D].
despus de hacerlo, A[Z] tiene una clave menor que pivote y A[D] tiene una clave por
lo menos igual que el pivote, y se sabra que en la siguiente fase de rastreo Z se
movera al menos una posicion a la derecha, en la A[D]anterior y D se movera al
menos una posicion a la izquierda.
Para poner la forma de un ciclo repeat, se pasa la fase desviar al principio. El efecto
es que inicialmente, cuando i = Z y j = D, se intercambia A[i] con A[j]. esto puede ser o no
correcto, pero no es muy importante, pues se supone que en un principio no existe ningun
orden en particuar para las claves entre A[i] A[j].
La funcion particion, que realiza las operaciones anteriores y devuelven Z, el punto en
el cual empieza la mitad superior del arreglo dividido.
Analisis de eficiencia del metodo quicksort
Ejemplo:
Aplique el mtodo quicksort para ordenar los arreglos, de manera que queden ordenados en forma
descendente por el nmero total de materias aprobadas.

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