61
HEAP SORT Algoritmo de Ordenamiento Integrantes: Daniel Gomez Jaramillo. Tania Landívar Ordoñez Jonnathan Peñaranda Sarmiento. Gabriela Verdugo Velesaca.

Algoritmo de ordenamiento: Heap Sort

Embed Size (px)

Citation preview

Page 1: Algoritmo de ordenamiento: Heap Sort

HEAP SORTAlgoritmo de Ordenamiento

Integrantes:

Daniel Gomez Jaramillo.

Tania Landívar Ordoñez

Jonnathan Peñaranda Sarmiento.

Gabriela Verdugo Velesaca.

Page 2: Algoritmo de ordenamiento: Heap Sort

CONTENIDO

1. Introducción

2. Descripción del método

I. Ventajas y desventajas.

II. Funcionamiento

III. Complejidad computacional

IV. Aplicaciones y usos en la actualidad

3. Conclusiones

4. Bibliografía.

5. Agradecimientos.

Page 3: Algoritmo de ordenamiento: Heap Sort

INTRODUCCIÓN

Ordenar una lista es la operación de arreglar los elementos de acuerdo algún criterio (nonecesariamente matemático). En el caso de tratarse de números el criterio de orden podría ser“<”, es decir, ordenar los elementos de la lista de menor a mayor. Aunque naturalmente un serhumano es capaz de implementar una metodología propia para ordenar un conjunto deelementos, esta tarea se vuelve extremadamente complicada cuando el número de elementos esgrande, puesto que se necesitaría mucho tiempo y se podrían cometer errores.

Ejemplos de esta situación podrían

ser: ordenar alfabéticamente a los

habitantes de una ciudad, ordenar

una biblioteca, clasificar

alfabéticamente las palabras de un

lenguaje, ordenar una serie de

paginas de internet, ordenar un

conjunto de números enteros, etc.

Page 4: Algoritmo de ordenamiento: Heap Sort

DESCRIPCIÓN DEL MÉTODO HEAP SORT

ORIGEN

Fue publicado originalmente por J.W.J. Williams llamándolo "Algorithm 232" en la revista"Communications of the ACM" en 1964.

Este algoritmo consiste en ordenar en un arbol y luego extraer del nodo que queda como raíz

en sucesivas iteraciones obteniendo el conjunto ordenado. Basa su funcionamiento en una

propiedad de montículos, por la cual, la cima siempre dependiendo de cómo se

defina contendrá el mayor o menor elemento del montículo.

DESCRIPCIÓN GENERAL

Page 5: Algoritmo de ordenamiento: Heap Sort

VENTAJAS Y DESVENTAJAS

VENTAJAS

• Funciona efectivamente con datosdesordenados.

• Su desempeño es en promedio tanbueno como el Quicksort.

• No utiliza memoria adicional.

DESVENTAJAS

• No es estable, ya que se comporta demanera ineficaz con datos del mismovalor

• Este método es mucho mas complejoque los demás.

Page 6: Algoritmo de ordenamiento: Heap Sort

FUNCIONAMIENTO DEL MÉTODO HEAPSORT

Este algoritmo consiste en almacenar todos los elementos en un montículo y luego extraer el nodo que queda como raíz en iteraciones sucesivas obteniendo el conjunto ordenado.

Para esto el método realiza los siguientes pasos:

• 1. Se construye el Heap/montículo a partir del arreglo original.

• 2. La raíz se coloca en el arreglo.

• 3. El último elemento del montículo se vuelve la raíz.

• 4. La nueva raíz se intercambia con el elemento de mayor valor por nivel.

• 5. Tras el paso anterior la raíz vuelve a ser el mayor del montículo.

• 6. Se repite el paso 2 hasta que quede el arreglo ordenado.

Page 7: Algoritmo de ordenamiento: Heap Sort

FUNCIONAMIENTO DEL MÉTODO HEAP SORT

<5 7 27 3 2 126, >, , ,,,

Page 8: Algoritmo de ordenamiento: Heap Sort

heap_sort(árbol, lista_ordenada)

{

while(árbol != NULL)

{

insertar_en_monticulo(árbol);

extraer_cima(árbol,lista_ordenada);

borrar_nodo(árbol,pos)

}

}5

7

6

27

23 12

¿5<7?VERDADERO

árbol

ETAPA 1

Page 9: Algoritmo de ordenamiento: Heap Sort

heap_sort(árbol, lista_ordenada)

{

while(árbol != NULL)

{

insertar_en_monticulo(árbol);

extraer_cima(árbol,lista_ordenada);

borrar_nodo(árbol,pos)

}

}5

7

6

27

23 12

¿5<7?VERDADERO

Page 10: Algoritmo de ordenamiento: Heap Sort

heap_sort(árbol, lista_ordenada)

{

while(árbol != NULL)

{

insertar_en_monticulo(árbol);

extraer_cima(árbol,lista_ordenada);

borrar_nodo(árbol,pos)

}

}5

6

27

23 12

¿5<3?FALSO

7

5

Page 11: Algoritmo de ordenamiento: Heap Sort

heap_sort(árbol, lista_ordenada)

{

while(árbol != NULL)

{

insertar_en_monticulo(árbol);

extraer_cima(árbol,lista_ordenada);

borrar_nodo(árbol,pos)

}

}5

6

27

23 12

¿5<2?FALSO

7

5FALSO ¿5<3?

Page 12: Algoritmo de ordenamiento: Heap Sort

heap_sort(árbol, lista_ordenada)

{

while(árbol != NULL)

{

insertar_en_monticulo(árbol);

extraer_cima(árbol,lista_ordenada);

borrar_nodo(árbol,pos)

}

}5

6

27

23 12

¿7<5?FALSO 7

5¿5<2?FALSO

Page 13: Algoritmo de ordenamiento: Heap Sort

heap_sort(árbol, lista_ordenada)

{

while(árbol != NULL)

{

insertar_en_monticulo(árbol);

extraer_cima(árbol,lista_ordenada);

borrar_nodo(árbol,pos)

}

}5

6

27

23 12

¿7<27?7

5

VERDADERO¿7<5?FALSO

Page 14: Algoritmo de ordenamiento: Heap Sort

heap_sort(árbol, lista_ordenada)

{

while(árbol != NULL)

{

insertar_en_monticulo(árbol);

extraer_cima(árbol,lista_ordenada);

borrar_nodo(árbol,pos)

}

}

6

27

23 12

¿7<27?7

5

VERDADERO

Page 15: Algoritmo de ordenamiento: Heap Sort

heap_sort(árbol, lista_ordenada)

{

while(árbol != NULL)

{

insertar_en_monticulo(árbol);

extraer_cima(árbol,lista_ordenada);

borrar_nodo(árbol,pos)

}

}

623 12

5

27

7

¿7<6? FALSO

Page 16: Algoritmo de ordenamiento: Heap Sort

heap_sort(árbol, lista_ordenada)

{

while(árbol != NULL)

{

insertar_en_monticulo(árbol);

extraer_cima(árbol,lista_ordenada);

borrar_nodo(árbol,pos)

}

}

623 12

5

27

7

¿7<6? FALSO ¿7<12? VERDADERO

Page 17: Algoritmo de ordenamiento: Heap Sort

heap_sort(árbol, lista_ordenada)

{

while(árbol != NULL)

{

insertar_en_monticulo(árbol);

extraer_cima(árbol,lista_ordenada);

borrar_nodo(árbol,pos)

}

}

623 12

5

27

7

¿7<12? VERDADERO

Page 18: Algoritmo de ordenamiento: Heap Sort

heap_sort(árbol, lista_ordenada)

{

while(árbol != NULL)

{

insertar_en_monticulo(árbol);

extraer_cima(árbol,lista_ordenada);

borrar_nodo(árbol,pos)

}

}

623

5

27

7

12

¿27<12? FALSO

Page 19: Algoritmo de ordenamiento: Heap Sort

heap_sort(árbol, lista_ordenada)

{

while(árbol != NULL)

{

insertar_en_monticulo(árbol);

extraer_cima(árbol,lista_ordenada);

borrar_nodo(árbol,pos)

}

}

623

5

27

7

12

¿27<12? FALSO

27lista_ordenada

Page 20: Algoritmo de ordenamiento: Heap Sort

heap_sort(árbol, lista_ordenada)

{

while(árbol != NULL)

{

insertar_en_monticulo(árbol);

extraer_cima(árbol,lista_ordenada);

borrar_nodo(árbol,pos)

}

}

623

5 12

27

7

27lista_ordenada

FIN ETAPA 1

Page 21: Algoritmo de ordenamiento: Heap Sort

heap_sort(árbol, lista_ordenada)

{

while(árbol != NULL)

{

insertar_en_monticulo(árbol);

extraer_cima(árbol,lista_ordenada);

borrar_nodo(árbol,pos)

}

}

623

5 12

7

27lista_ordenada

FIN ETAPA 1ETAPA 2

Page 22: Algoritmo de ordenamiento: Heap Sort

heap_sort(árbol, lista_ordenada)

{

while(árbol != NULL)

{

insertar_en_monticulo(árbol);

extraer_cima(árbol,lista_ordenada);

borrar_nodo(árbol,pos)

}

}

623

5 12

7

27lista_ordenada

¿5<12?

VERDADERO

Page 23: Algoritmo de ordenamiento: Heap Sort

heap_sort(árbol, lista_ordenada)

{

while(árbol != NULL)

{

insertar_en_monticulo(árbol);

extraer_cima(árbol,lista_ordenada);

borrar_nodo(árbol,pos)

}

}

623

5 12

7

27lista_ordenada

¿5<12?

VERDADERO

Page 24: Algoritmo de ordenamiento: Heap Sort

heap_sort(árbol, lista_ordenada)

{

while(árbol != NULL)

{

insertar_en_monticulo(árbol);

extraer_cima(árbol,lista_ordenada);

borrar_nodo(árbol,pos)

}

}

623

12

27lista_ordenada

5

7 ¿7<12? VERDADERO

Page 25: Algoritmo de ordenamiento: Heap Sort

heap_sort(árbol, lista_ordenada)

{

while(árbol != NULL)

{

insertar_en_monticulo(árbol);

extraer_cima(árbol,lista_ordenada);

borrar_nodo(árbol,pos)

}

}

623

12

27lista_ordenada

5

7 ¿7<12? VERDADERO

Page 26: Algoritmo de ordenamiento: Heap Sort

heap_sort(árbol, lista_ordenada)

{

while(árbol != NULL)

{

insertar_en_monticulo(árbol);

extraer_cima(árbol,lista_ordenada);

borrar_nodo(árbol,pos)

}

}

623

27lista_ordenada

5 7

12

¿7<6? FALSO

Page 27: Algoritmo de ordenamiento: Heap Sort

heap_sort(árbol, lista_ordenada)

{

while(árbol != NULL)

{

insertar_en_monticulo(árbol);

extraer_cima(árbol,lista_ordenada);

borrar_nodo(árbol,pos)

}

}

623

27lista_ordenada

5

¿12<7? FALSO

¿7<6? FALSO

7

12

Page 28: Algoritmo de ordenamiento: Heap Sort

heap_sort(árbol, lista_ordenada)

{

while(árbol != NULL)

{

insertar_en_monticulo(árbol);

extraer_cima(árbol,lista_ordenada);

borrar_nodo(árbol,pos)

}

}

623

27lista_ordenada

5

¿12<7? FALSO

7

12

12

Page 29: Algoritmo de ordenamiento: Heap Sort

heap_sort(árbol, lista_ordenada)

{

while(árbol != NULL)

{

insertar_en_monticulo(árbol);

extraer_cima(árbol,lista_ordenada);

borrar_nodo(árbol,pos)

}

}

23

27lista_ordenada

5 7

12

6

2712

Page 30: Algoritmo de ordenamiento: Heap Sort

heap_sort(árbol, lista_ordenada)

{

while(árbol != NULL)

{

insertar_en_monticulo(árbol);

extraer_cima(árbol,lista_ordenada);

borrar_nodo(árbol,pos)

}

}

23

27lista_ordenada

5 7

6

2712

Page 31: Algoritmo de ordenamiento: Heap Sort

heap_sort(árbol, lista_ordenada)

{

while(árbol != NULL)

{

insertar_en_monticulo(árbol);

extraer_cima(árbol,lista_ordenada);

borrar_nodo(árbol,pos)

}

}

23

5 7

6

27lista_ordenada 2712

¿5<7?

VERDADERO

Page 32: Algoritmo de ordenamiento: Heap Sort

heap_sort(árbol, lista_ordenada)

{

while(árbol != NULL)

{

insertar_en_monticulo(árbol);

extraer_cima(árbol,lista_ordenada);

borrar_nodo(árbol,pos)

}

}

23

5 7

6

27lista_ordenada 2712

¿5<7?

VERDADERO

Page 33: Algoritmo de ordenamiento: Heap Sort

heap_sort(árbol, lista_ordenada)

{

while(árbol != NULL)

{

insertar_en_monticulo(árbol);

extraer_cima(árbol,lista_ordenada);

borrar_nodo(árbol,pos)

}

}

23

5

¿6<7? VERDADERO

7

6

27lista_ordenada 2712

Page 34: Algoritmo de ordenamiento: Heap Sort

heap_sort(árbol, lista_ordenada)

{

while(árbol != NULL)

{

insertar_en_monticulo(árbol);

extraer_cima(árbol,lista_ordenada);

borrar_nodo(árbol,pos)

}

}

23

5

¿6<7? VERDADERO

7

6

27lista_ordenada 2712

Page 35: Algoritmo de ordenamiento: Heap Sort

heap_sort(árbol, lista_ordenada)

{

while(árbol != NULL)

{

insertar_en_monticulo(árbol);

extraer_cima(árbol,lista_ordenada);

borrar_nodo(árbol,pos)

}

}

23

5 6

7

272712lista_ordenada 2727127

Page 36: Algoritmo de ordenamiento: Heap Sort

heap_sort(árbol, lista_ordenada)

{

while(árbol != NULL)

{

insertar_en_monticulo(árbol);

extraer_cima(árbol,lista_ordenada);

borrar_nodo(árbol,pos)

}

}

3

5 6

lista_ordenada 2727127

2

7

Page 37: Algoritmo de ordenamiento: Heap Sort

heap_sort(árbol, lista_ordenada)

{

while(árbol != NULL)

{

insertar_en_monticulo(árbol);

extraer_cima(árbol,lista_ordenada);

borrar_nodo(árbol,pos)

}

}

3

lista_ordenada 2727127

2

5 6¿5<6?

VERDADERO

Page 38: Algoritmo de ordenamiento: Heap Sort

heap_sort(árbol, lista_ordenada)

{

while(árbol != NULL)

{

insertar_en_monticulo(árbol);

extraer_cima(árbol,lista_ordenada);

borrar_nodo(árbol,pos)

}

}

3

5 6

lista_ordenada 2727127

2

¿5<6?

VERDADERO

Page 39: Algoritmo de ordenamiento: Heap Sort

heap_sort(árbol, lista_ordenada)

{

while(árbol != NULL)

{

insertar_en_monticulo(árbol);

extraer_cima(árbol,lista_ordenada);

borrar_nodo(árbol,pos)

}

}

6

lista_ordenada 2727127

2

3

5

¿2<6? VERDADERO

Page 40: Algoritmo de ordenamiento: Heap Sort

heap_sort(árbol, lista_ordenada)

{

while(árbol != NULL)

{

insertar_en_monticulo(árbol);

extraer_cima(árbol,lista_ordenada);

borrar_nodo(árbol,pos)

}

}

6

lista_ordenada 2727127

2 ¿2<6? VERDADERO

3

5

Page 41: Algoritmo de ordenamiento: Heap Sort

heap_sort(árbol, lista_ordenada)

{

while(árbol != NULL)

{

insertar_en_monticulo(árbol);

extraer_cima(árbol,lista_ordenada);

borrar_nodo(árbol,pos)

}

}

2727127

2

6

6lista_ordenada

3

5

Page 42: Algoritmo de ordenamiento: Heap Sort

heap_sort(árbol, lista_ordenada)

{

while(árbol != NULL)

{

insertar_en_monticulo(árbol);

extraer_cima(árbol,lista_ordenada);

borrar_nodo(árbol,pos)

}

}

lista_ordenada

5 2

3

6

27271276

Page 43: Algoritmo de ordenamiento: Heap Sort

heap_sort(árbol, lista_ordenada)

{

while(árbol != NULL)

{

insertar_en_monticulo(árbol);

extraer_cima(árbol,lista_ordenada);

borrar_nodo(árbol,pos)

}

}

lista_ordenada 27271276

5 2

3

¿5<2?

FALSO

Page 44: Algoritmo de ordenamiento: Heap Sort

heap_sort(árbol, lista_ordenada)

{

while(árbol != NULL)

{

insertar_en_monticulo(árbol);

extraer_cima(árbol,lista_ordenada);

borrar_nodo(árbol,pos)

}

}

5 2

3

lista_ordenada 27271276

¿3<5?VERDADERO

¿5<2?

FALSO

Page 45: Algoritmo de ordenamiento: Heap Sort

heap_sort(árbol, lista_ordenada)

{

while(árbol != NULL)

{

insertar_en_monticulo(árbol);

extraer_cima(árbol,lista_ordenada);

borrar_nodo(árbol,pos)

}

}

2

lista_ordenada 27271276

3

5

¿3<5?VERDADERO

Page 46: Algoritmo de ordenamiento: Heap Sort

heap_sort(árbol, lista_ordenada)

{

while(árbol != NULL)

{

insertar_en_monticulo(árbol);

extraer_cima(árbol,lista_ordenada);

borrar_nodo(árbol,pos)

}

}

lista_ordenada 27271276

3 2

5

Page 47: Algoritmo de ordenamiento: Heap Sort

heap_sort(árbol, lista_ordenada)

{

while(árbol != NULL)

{

insertar_en_monticulo(árbol);

extraer_cima(árbol,lista_ordenada);

borrar_nodo(árbol,pos)

}

}

27271276

3 5

2

lista_ordenada5

Page 48: Algoritmo de ordenamiento: Heap Sort

heap_sort(árbol, lista_ordenada)

{

while(árbol != NULL)

{

insertar_en_monticulo(árbol);

extraer_cima(árbol,lista_ordenada);

borrar_nodo(árbol,pos)

}

}

27271276

3

2

5lista_ordenada

¿2<3?VERDADERO

Page 49: Algoritmo de ordenamiento: Heap Sort

heap_sort(árbol, lista_ordenada)

{

while(árbol != NULL)

{

insertar_en_monticulo(árbol);

extraer_cima(árbol,lista_ordenada);

borrar_nodo(árbol,pos)

}

}

27271276

3

2

5lista_ordenada

¿2<3?VERDADERO

Page 50: Algoritmo de ordenamiento: Heap Sort

heap_sort(árbol, lista_ordenada)

{

while(árbol != NULL)

{

insertar_en_monticulo(árbol);

extraer_cima(árbol,lista_ordenada);

borrar_nodo(árbol,pos)

}

}

27271276

2

3

5lista_ordenada

Page 51: Algoritmo de ordenamiento: Heap Sort

heap_sort(árbol, lista_ordenada)

{

while(árbol != NULL)

{

insertar_en_monticulo(árbol);

extraer_cima(árbol,lista_ordenada);

borrar_nodo(árbol,pos)

}

}

27271276

3

2

5lista_ordenada3

Page 52: Algoritmo de ordenamiento: Heap Sort

heap_sort(árbol, lista_ordenada)

{

while(árbol != NULL)

{

insertar_en_monticulo(árbol);

extraer_cima(árbol,lista_ordenada);

borrar_nodo(árbol,pos)

}

}

27271276

2

5lista_ordenada 3

Page 53: Algoritmo de ordenamiento: Heap Sort

heap_sort(árbol, lista_ordenada)

{

while(árbol != NULL)

{

insertar_en_monticulo(árbol);

extraer_cima(árbol,lista_ordenada);

borrar_nodo(árbol,pos)

}

}

27271276

2

53lista_ordenada

2

Page 54: Algoritmo de ordenamiento: Heap Sort

heap_sort(árbol, lista_ordenada)

{

while(árbol != NULL)

{

insertar_en_monticulo(árbol);

extraer_cima(árbol,lista_ordenada);

borrar_nodo(árbol,pos)

}

}

272712765lista_ordenada 32

árbol = NULL

2

FIN ETAPA 2

Page 55: Algoritmo de ordenamiento: Heap Sort

heap_sort(árbol, lista_ordenada)

{

while(árbol != NULL)

{

insertar_en_monticulo(árbol);

extraer_cima(árbol,lista_ordenada);

borrar_nodo(árbol,pos)

}

}

272712765lista_ordenada 32

árbol = NULL

FIN DEL ALGORITMOFIN ETAPA 2

Page 56: Algoritmo de ordenamiento: Heap Sort

272712765lista_ordenada 32

RESULTADO:

Page 57: Algoritmo de ordenamiento: Heap Sort

COMPLEJIDAD DE HEAP SORT

El algoritmo de ordenación por montículos o Heap Sort recorre el conjunto de elementos

desde la posición de la mitad hasta la primera organizando el montículo correspondiente a

dicho elemento. Una vez terminado este proceso, se inicia el proceso de ordenación

intercambiando el primer elemento por el último del arreglo y reorganizando el montículo a

partir de la primera posición.

La complejidad del algoritmo de ordenación por

montículos es O(n log n) teniendo en cuenta que el

proceso de organizar el montículo en el peor caso

solamente tiene que hacer intercambios sobre una sola

línea de elementos desde la raíz del árbol hasta alguna

de las hojas para un máximo de n log (n) intercambios.

Page 58: Algoritmo de ordenamiento: Heap Sort

APLICACIONES Y USOS EN LA ACTUALIDAD

Una de las mas grandes aplicaciones de Heap Sort es construir colas de prioridad con la idea que

busque los procesos que llevan la mayor carga de prioridad dado una gran cantidad de procesos

por hacer.

Otra aplicación es la de Programación de Intervalos, en donde se tiene una lista de tareas con un

tiempo de inicio y fin y deseamos hacer tantas tareas como sean posibles en un periodo de tiempo

limitado.

En esencia una aplicación o algoritmo que trate de ordenar una lista de elementos dependerán

eficientemente en un algoritmo de ordenamiento, y el método Heap Sort puede proveernos de tal

función.

Page 59: Algoritmo de ordenamiento: Heap Sort

CONCLUSIONES

La principal ventaja de este método de ordenamiento es su eficiencia en el tiempo de ejecución,

el cual es O(n log n). La eficiencia de la memoria, para la implementación del algoritmo es O(1),

tanto en la forma iterativa como recursiva.

Concluyendo, decimos que este método es conveniente

usarlo cuando se trata de ordenar arreglos o listas grandes,

ya que cuando por ejemplo, este se encuentra con

elementos repetidos, el algoritmo suele tener

inconvenientes a diferencia de otros métodos como el Quick

Sort y el Merge Sort.

Page 60: Algoritmo de ordenamiento: Heap Sort

REFERENCIAS BIBLIOGRÁFICAS

• Dr. GuillermoCámara Chávez. (2015). Ordenación. 06/06/2016, de homepages. Sitio web:

http://homepages.dcc.ufmg.br/~gcamarac/cursos/algoritmia/ordenacion_4pages_sec.pdf

• Conrado Martínez. (2012). Algorítmica: Heaps y heapsort. 06/06/2016, de algorithmics Sitio

web: http://algorithmics.lsi.upc.edu/docs/pqueues.pdf

• Springer-Verlag (1991). “Algorithms and Data Strctures”. Ottawa, Canada. 06/06/2016,

Disponible en: https://books.google.com.ec/books?id=NRrcsIJZAYMC

Page 61: Algoritmo de ordenamiento: Heap Sort

¡¡ GRACIAS !!

Estructura de Datos y Análisis de Algoritmos.