Ordenamiento shell & heapsort

Post on 02-Jun-2015

1.226 views 8 download

Transcript of Ordenamiento shell & heapsort

ORDENAMIENTO SHELL

Shell nos propone que hagamos sobre el arreglo una serie de ordenaciones basadas en la inserción directa, pero dividiendo el arreglo original en varios sub-arreglos tales que cada elemento esté separado k elementos del anterior (salto o gap).

ORDENAMIENTO SHELL

Se debe empezar con k=n/2, siendo n el número de elementos de arreglo, y utilizando siempre la división entera, después iremos variando k haciéndolo más pequeño mediante sucesivas divisiones por 2, hasta llegar a k=1.

ORDENAMIENTO SHELL

Pongamos un ejemplo:

» Se pide ordenar ascendentemente este arreglo

74, 14, 21, 44, 38, 97, 11, 78, 65, 88, 30.

n=11

ORDENAMIENTO SHELL

1. k=n/2 >>> 11/2=5

74, 14, 21, 44, 38, 97, 11, 78, 65, 88, 30

30, 14, 21, 44, 38, 74, 11, 78, 65, 88, 97

ORDENAMIENTO SHELL

30, 14, 21, 44, 38, 74, 11, 78, 65, 88, 97

30, 11, 21, 44, 38, 74, 14, 78, 65, 88, 97

ORDENAMIENTO SHELL

30, 11, 21, 44, 38, 74, 14, 78, 65, 88, 97

30, 11, 21, 44, 38, 74, 14, 78, 65, 88, 97

ORDENAMIENTO SHELL

30, 11, 21, 44, 38, 74, 14, 78, 65, 88, 97

30, 11, 21, 44, 38, 74, 14, 78, 65, 88, 97

Arreglo 5-ordenado

ORDENAMIENTO SHELL

2. k=k/2 >>> 5/2=2

30, 11, 21, 44, 38, 74, 14, 78, 65, 88, 97

14, 11, 21, 44, 30, 74, 38, 78, 65, 88, 97

Arreglo 2-ordenado

ORDENAMIENTO SHELL

Shell.cpp

ORDENAMIENTO SHELL

3. k=k/2 >>> 2/2=1

14, 11, 21, 44, 30, 74, 38, 78, 65, 88, 97

11, 14, 21, 30, 38, 44, 65, 74, 78, 88, 97

ORDENAMIENTO HEAPSORT

ORDENAMIENTO HEAPSORT

Según Williams[2001] un montículo o montón se define como una secuencia de llaves hi que tienen la siguiente relación de orden:

hi <=h2i y hi<=h2i+1

Para i= 1,2,…,N/2.

ORDENAMIENTO HEAPSORT

Pongamos un ejemplo:

» Ordenar descendente este arreglo:

9, 15, 6, 10, 4, 24, 18, 14, 22

ORDENAMIENTO HEAPSORT

Primero: Hacerlo un montículo.

9, 15, 6, 10, 4, 24, 18, 14, 22

Comparamos la posición 4 con la 8 y 9.10<14 y 10<22 … (V)

ORDENAMIENTO HEAPSORT

9, 15, 6, 10, 4, 24, 18, 14, 22

Comparamos la posición 3 con la 6 y 7. 6<24 y 6<18 … (V)

ORDENAMIENTO HEAPSORT

9, 15, 6, 10, 4, 24, 18, 14, 22

Comparamos la posición 2 con la 4 y 5.15<10 y 15<4 … (F)

Se intercambia de posición quedando.9, 4, 6, 10, 15, 24, 18, 14, 22

ORDENAMIENTO HEAPSORT

Puesto que se han hecho modificaciones se comprueba para i>2

9, 4, 6, 10, 15, 24, 18, 14, 22

9, 15, 6, 10, 4, 24, 18, 14, 22

ORDENAMIENTO HEAPSORT

9, 4, 6, 10, 15, 24, 18, 14, 22

Comparamos la posición 1 con la 2 y 3.9<15 y 9<6 … (F)

Se intercambia de posición quedando.4, 9, 6, 10, 15, 24, 18, 14, 22

ORDENAMIENTO HEAPSORT

Se comprueba para i>1

4, 9, 6, 10, 15, 24, 18, 14, 22

4, 9, 6, 10, 15, 24, 18, 14, 22

4, 9, 6, 10, 15, 24, 18, 14, 22

ORDENAMIENTO HEAPSORT

Ahora se repite esta secuencia pero intercambiando el primer termino por el ultimo y

reduciendo en 1 el numero de términos del arreglo, y construyendo e montón con los n-1

primeros términos.

ORDENAMIENTO HEAPSORT

4, 9, 6, 10, 15, 24, 18, 14, 22

22, 9, 6, 10, 15, 24, 18, 14, 4

Llama a la función montículo

6, 9, 18, 10, 15, 24, 22, 14, 4

ORDENAMIENTO HEAPSORT

Luego se sigue este proceso intercambiando el primer termino del nuevo montículo, ya no por el ultimo, sino por el penúltimo.

Luego se procede a formar otro nuevo montículo con 1 término menos que el anterior :

(n-1)-1 = n-2

ORDENAMIENTO HEAPSORT

6, 9, 18, 10, 15, 24, 22, 14, 4

14, 9, 18, 10, 15, 24, 22, 6, 4

Llama a la función montículo

9, 10, 18, 14, 15, 24, 22, 6, 4

ORDENAMIENTO HEAPSORT

Este proceso se repite sucesivamente hasta llegar hasta que nuestro montículo a construir tenga

n-n=0 términos:

ORDENAMIENTO HEAPSORT

18, 22, 24, 15, 14, 10, 9, 6, 4

24, 22, 18, 15, 14, 10, 9, 6, 4

Llama a la función montículo

22, 24, 18, 15, 14, 10, 9, 6, 4

ORDENAMIENTO HEAPSORT

22, 24, 18, 15, 14, 10, 9, 6, 4

Quedando finalmente el arreglo ordenado ascendentemente:

24, 22, 18, 15, 14, 10, 9, 6, 4