You are on page 1of 41

CLASE 6

CURSO: PROGRAMACIÓN III

ING. Carlos Armando Escobar Garza


Método Shell de Ordenación
El método de ordenación Shell debe su nombre a su inventor,
Donald Shell, y fue uno de los primeros algoritmos de
ordenamiento en romper la barrera del tiempo cuadrático.

Es una mejora del método de inserción directa, utilizado


cuando el array tiene un gran número de elementos.

Cualquier algoritmo de ordenación que intercambia elementos


adyacentes (como los algoritmos burbuja, selección o
inserción) tiene un tiempo promedio de ejecución de orden
cuadrático (n2).
El método Shell mejora este tiempo comparando cada
elemento con el que está a un cierto número de
posiciones llamado salto, en lugar de compararlo con
el el que está justo a su lado. Este salto es constante,
y su valor inicial es N/2 (siendo N el número de
elementos, y siendo división entera).

Se van dando pasadas con el mismo salto hasta que


en una pasada no se intercambie ningún elemento de
sitio. Entonces el salto se reduce a la mitad, y se
vuelven a dar pasadas hasta que no se intercambie
ningún elemento, y así sucesivamente hasta que el
salto vale 1.
Los pasos a seguir por el algoritmo para una lista de n elementos son:
1. Se divide la lista original en n/2 grupos de dos, considerando un incremento
o salto entre los elementos de n/2.
2. Se clasifica cada grupo por separado, comparando las parejas de
elementos, y si no están ordenados se intercambian.
3. Se divide ahora la lista en la mitad de grupos (n/4), con un incremento o
salto entre los elementos también mitad (n/4), y nuevamente se clasifica
cada grupo por separado.
4. Así sucesivamente, se sigue dividiendo la lista en la mitad de grupos que en
el recorrido anterior con un incremento o salto decreciente en la mitad que el
salto anterior, y luego clasificando cada grupo por separado.
5. El algoritmo termina cuando se llega a que el tamaño del salto es 1.
Ejemplo números pares:
Obtener las secuencias parciales del vector al aplicar el método Shell para
ordenar en orden creciente la lista:

16 72 23 9 1 56 12 99

1. El número de elementos que tiene la lista es 7, por lo que el salto inicial es


n/2; 8/2= 4
16 72 23 9 1 56 12 99

1 es menor a 16 por lo tanto se intercambian


1 72 23 9 16 56 12 99
1 72 23 9 16 56 12 99

56 es menor a 72 por lo tanto se intercambian

1 56 23 9 16 72 12 99

12 es menor a 23 por lo tanto se intercambian

1 56 12 9 16 72 23 99

99 NO es menor a 9 por lo tanto NO se intercambian

1 56 12 9 16 72 23 99
Siguiendo el algoritmo se dividen a la mitad las listas resultantes siendo
n/2 = 8/2= 4
4/2 = 2 (saltos de 2)

1 56 12 9 16 72 23 99

12 NO es menor a 1 por lo tanto NO se intercambian

1 56 12 9 16 72 23 99

9 es menor a 56 por lo tanto se intercambian

1 9 12 56 16 72 23 99

16 NO es menor a 12 por lo tanto NO se intercambian


1 9 12 56 16 72 23 99

92 NO es menor a 56 por lo tanto NO se intercambian

1 9 12 56 16 72 23 99

23 NO es menor a 16 por lo tanto NO se intercambian

1 9 12 56 16 72 23 99

99 NO es menor a 72 por lo tanto NO se intercambian

Siguiendo el algoritmo se dividen a la mitad las listas resultantes siendo


n/2 = 8/2= 4
4/2 = 2 (saltos de 2)
2/2 = 1 salto
1 9 12 56 16 72 23 99

9 NO es menor a 1 por lo tanto NO se intercambian

1 9 12 56 16 72 23 99

12 NO es menor a 9 por lo tanto NO se intercambian

1 9 12 56 16 72 23 99

56 NO es menor a 12 por lo tanto NO se intercambian

1 9 12 56 16 72 23 99

16 es menor a 56 por lo tanto se intercambian


1 9 12 16 56 72 23 99

72 NO es menor a 56 por lo tanto NO se intercambian

1 9 12 16 56 72 23 99

23 es menor a 72 por lo tanto se intercambian

1 9 12 16 56 23 72 99

99 NO es menor a 72 por lo tanto NO se intercambian

Se ejecuta un ordenamiento por inserción completo como


último paso
1 9 12 16 56 23 72 99
1 9 12 16 23 56 72 99
Ejemplo 2:
Obtener las secuencias parciales del vector al aplicar el método
Shell para ordenar en orden creciente la lista: 6 1 5 2 3 4 0

1. El número de elementos que tiene la lista es 7, por lo que el


salto inicial es n/2; 7/2= 3 (se trabaja con enteros)
Recorrido Salto Intercambios Lista
1 3 (6,2) (5,4) (6,0) 2140356
2 3 (2,0) 0142356
3 3 ninguno 0142356
Salto 3/2= 1
4 1 (4,2) 0124356
(4,3) 0123456
5 1 ninguno 0123456
Ejercicio Dada la siguiente lista de números: [5, 16, 20, 12, 3,
8, 9, 17, 19, 7] ¿Cuál de las siguientes respuestas ilustra el
contenido de la lista después de que todo el intercambio está
completo para un tamaño de brecha o salto de 3?

(A) [5, 3, 8, 7, 16, 19, 9, 17, 20, 12]


(B) [3, 7, 5, 8, 9, 12, 19, 16, 20, 17]
(C) [3, 5, 7, 8, 9, 12, 16, 17, 19, 20]
(D) [5, 16, 20, 3, 8, 12, 9, 17, 20, 7]
ORD ENACIÓN RÁPIDA (QuickSort)
El algoritmo conocido como quicksort (ordenación rápida) recibe su
nombre de su autor, Tony Hoare. La idea del algoritmo es simple, se basa
en la división en particiones de la lista a ordenar, por ello se puede
considerar que aplica la técnica "divide y vencerás". El método es,
posiblemente, el más pequeño de código, más rápido, más elegante y más
interesante y eficiente de los algoritmos conocidos de ordenación.
Este método se basa en dividir los n elementos de la lista a ordenar en dos
partes o particiones separadas por un elemento: una partición izquierda,
un elemento central denominado pivote o elemento de partición y una
partición derecha. La partición o división se hace de tal forma que todos
los elementos de la primera sublista (partición izquierda) sean menores
que todos los elementos de la segunda sublista (partición derecha). Las
dos sublistas se ordenan entonces independientemente.
Explicación abstracta del funcionamiento de QuickSort
1.Se elige un elemento v de la lista L de elementos al que se le
llama pivote.
2.Se particiona la lista L en tres listas:
1.L1 - que contiene todos los elementos de L menos v que
sean menores o iguales que v
2.L2 - que contiene a v
3.L3 - que contiene todos los elementos de L menos v que
sean mayores o iguales que v
3.Se aplica la recursión sobre L1 y L3
4.Se unen todas las soluciones que darán forma final a la lista L
finalmente ordenada. Como L1 y L3 están ya ordenados, lo
único que tenemos que hacer es concatenar L1, L2 y L3
Eligiendo el Pivote
La velocidad de ejecución del algoritmo depende en gran
medida de como se implementa este mecanismo, una mala
implementación puede suponer que el algoritmo se
ejecute a una velocidad mediocre o incluso pésima. La
elección del pivote determina las particiones de la lista de
datos, por lo tanto, huelga decir que esta es la parte más
crítica de la implementación del algoritmo QuickSort. Es
importante intentar que al seleccionar el pivote v las
particiones L1 y L3 tengan un tamaño idéntico dentro de lo
posible.
Elegir el primero o el último de la lista nunca es una buena
idea ya que los elementos de la lista no están uniformemente
Una buena estrategia para solucionar la selección del pivote
ampliamente extendida es la conocida como "a tres bandas".
En esta estrategia lo que se persigue es hacer una media con
los valores de tres de los elementos de la lista. Por ejemplo si
nuestra lista es [ 8, 4, 9, 3, 5, 7, 1, 6, 2 ] la media sería ( 8 + 2
+ 5 ) / 3 = 5 lo que daría lugar a las siguientes particiones:
•L1 = [ 8, 9, 7, 6 ]
•L2 = [ 5 ]
•L3 = [ 1, 2, 4, 3 ]
Esta estrategia no nos asegura que siempre nos dará la
mejor selección del pivote, sino que estadísticamente, la
elección del pivote sea buena.
Pivote = 4

4 3 1 5 2 6 8

i j

Índice i se moverá a la derecha si apunta a un número menor al


pivote
Índice j se moverá a la izquierda si apunta a un número mayor al
pivote
Pivote = 4

4 3 1 5 2 6 8

i j
I apunta a un número igual al pivote por lo tanto se queda fijo
J se mueve hacia la izquierda hasta encontrar un número menor al pivote

4 3 1 5 2 6 8

i j
Se realiza el intercambio y 2 pasa a ser el primer elemento de la lista
2 3 1 5 4 6 8

i j
I apunta a un número menor al pivote por lo que se mueve a la siguiente casilla

2 3 1 5 4 6 8

i j
i apunta a un número menor al pivote por lo que se mueve a la siguiente casilla
2 3 1 5 4 6 8

i
j apunta a un número mayor al pivote por lo tanto se mueve hacia la izquierda

2 3 1 5 4 6 8

j i
Cuando se cruzan los índices ya no se realiza intercambio y se termina la
primer pasada
pivote
2 3 1 4 5 6 8
Elementos menores al pivote Elementos mayores o iguales al
pivote
Se repite el algoritmo con cada una de las Se repite el algoritmo con cada una de las sublistas
Se elije el primero como pivote = 5
sublistas
Se elije el primero como pivote = 2 5 6 8
2 3 1
i j
i j 5 es igual a pivote se queda igual
j no es menor a pivote se queda igual

2 es menor a pivote se queda igual 5 6 8


1 no es mayor a pivote se hace intercambio

1 3 2 i j
i 5 6
I ++
8

j j I J–
Como están cruzados se termina
la pasada
Se repite el algoritmo con cada una de las
sublistas
Se elije el primero como pivote = 3

1 3 2

i j
2 no es mayor a pivote se hace intercambio

1 2 3

i
j
1 2 3 4 5 6 8

L1 L2 L3

Concatenamos las listas


9

Tomamo
s pivote 8
9

9
Ejemplo 3
Se ordena una lista de números enteros aplicando el algoritmo quicksort,
como pivote se elige el
elemento central de la lista.
Lista original: 8 1 4 9 6 3 5 2 7 0
Pivote (elemento central) 6

La etapa 2 requiere mover todos los elementos menores que el pivote a


la parte izquierda del array y los elementos mayores a la parte derecha.
Para ello, se recorre la lista de izquierda a derecha utilizando un índice i
que se inicializa a la posición más baja (inferior) buscando un elemento
mayor al pivote. También se recorre la lista de derecha a izquierda
buscando un elemento menor. Para hacer esto se utilizará un índice j
inicializado a la posición más alta (superior).
El índice i se detiene en el elemento 8 (mayor que el pivote) y el índice j
se detiene en el elemento 0 (menor que el pivote)
Se vuelve a realizar el proceso para
las sublistas como el ejemplo
anterior (ejercicio terminar)
En conclusión, se suele recomendar que,
para listas pequeñas, los métodos más
eficientes son:
inserción y selección, y para listas grandes,
quicksort. El algoritmo de Shell suele variar
mucho su eficiencia en función de la
variación del número de elementos por lo
que es más difícil que en los otros métodos
proporcionar un consejo eficiente. Los métodos
Tarea:
Investigar Algoritmo de ordenamiento
Merge Sort

Y elaborarlo en Go

Próxima clase árboles binarios, arboles AVL

You might also like