UNIVERSIDAD CENTRAL DEL ECUADOR
FACULTAD DE INGENIERIA EN CIENCIAS FISICAS Y MATEMATICAS
PROGRAMACION
METODO DE ORDENAMIENTO HEAP SORT
INTEGRANTES: KATHERINE CHANGO GABRIEL IÑIGUEZ NATHALIA TAIPE EDUARDO VALDEZ MARIA YAUTIBUG
INTRODUCCION Tipos de Ordenamiento La ordenación o clasificación de datos consiste en la disposición de los mismos de acuerdo con algún valor o característica. característica. Por ejemplo, cada elemento de una agenda telefónica tiene un campo nombre, un campo dirección y un campo número telefónico. Por lo regular los datos en la agenda se encuentran organizados en un orden de la A la Z. De la misma forma un lista ó vector de datos se dice que esta ordenado de manera ascendente, si X [ i ] <= X [ i +1] y, por otro lado, se dice que esta ordenado de manera descendente sí X [ i ] >= X [ i +1]. El proceso de ordenación es uno de los mecanismos más interesantes cuando llega el momento de mostrar que existen múltiples soluciones para un mismo problema, y que cada solución algorítmica tiene sus propias ventajas y desventajas. Una forma de medir la eficiencia de un algoritmo de esta clase, es verificar el número de comparaciones entre valores clave, además del número de movimientos que se tengan que realizar entre elementos (intercambios) de la lista. Los métodos de ordenamiento que trabajan con estructuras de datos Ordenamientos Internos, residentes en memoria principal se denominan Ordenamientos mientras que las implementaciones que utilizan estructuras de datos Ordenamientos externos. residentes en archivos se conocen como Ordenamientos
OBJETIVOS OBJETIVO GENERAL: Investigar el método de ordenamiento por montículos para tener una agilidad para desarrollar programas programas con el correcto correcto algoritmo.
OBJETICOS ESPECIFICOS: Analizar el procedimiento del algoritmo. Profundizar el aprendizaje de los métodos de investigación basado en el método de heap sort.
MARCO TEORICO El método de Heapsort es conocido con el nombre de montículo en el mundo de habla hispana. Es el método más eficiente de los métodos de ordenación que trabaja con árboles. La idea central de este algoritmo consiste en: 1.- Construir un montículo 2.- Eliminar la raíz del montículo en forma repetida
HeapSort: ¿Qué es? •
•
•
•
Es un método de ordenamiento basado con comparación. Usa el montículo (Heap) como estructura de datos, el cual representa un árbol. Más lento que otros métodos, pero más eficaz en escenarios más rigurosos. Se defino como No Recursivo y No Estable.
Algoritmo Lógico 1. 2. 3. 4. 5.
Se construye el montículo inicial a partir del arreglo original. Se intercambia la raíz con el último elemento del montículo. El último elemento queda ordenado. El último elemento se saca del montículo, no del arreglo. Se restaura el montículo haciendo que el primer elemento elemento baje a la posición que le corresponde, si sus hijos son menores. 6. La raíz vuelve a ser el mayor del montículo. 7. Se repite el paso 2 hasta que quede un solo elemento en el montículo.
El método de ordenación se puede describir con los siguientes pasos: 1- Construir un montículo inicial con todos los elementos del vector A[1], A[2], ...., A[n] 2- Intercambiar los valores de A[1] y A[n] (siempre se queda el máximo en el extremo) 3- Reconstruir el montículo con los elementos A[1], A[2],......, A[n-1] 4- Intercambiar los valores de A[1] y A[n-1] 5- Reconstruir el montículo con los elementos A[1], A[2],......, A[n-2]
Este es un proceso iterativo que partiendo de un montículo mo ntículo inicial, repite intercambiar los Extremos, decremento en 1 la posición posición del extremo superior y reconstruir reconstruir el montículo del nuevo vector. Lo expresamos en forma algorítmica así: Ordenación Heapsort (Vector, N) Debe construirse un montículo inicial (Vector, N) Desde k = N hasta 2 hacer Intercambio (Vector[1], Vector[k]) Construir montículo (Vector, 1, k-1) fin desde
Ordenación basada en comparaciones (Heap Sort) Es una variante del algoritmo de selección, El ordenamiento por montículos (Heap sort) es un algoritmo de ordenación no recursivo, no estable, con complejidad computacional O(n log n). Este algoritmo consiste en almacenar todos los elementos del vector a ordenar en un montículo (heap), y luego extraer el nodo que queda como nodo raíz del montículo (cima) en sucesivas iteraciones obteniendo el conjunto ordenado. Basa su funcionamiento en una propiedad de los montículos, por la cual, la cima contiene siempre el menor elemento elem ento (o el mayor, según se haya definido el montículo) de todos los almacenados en él. él . El significado de heap en computación es el de una cola de prioridades (priority queue).
Tiene las siguientes características:
Un heap es un arreglo de n posiciones ocupado por los elementos de la cola. Se mapea un árbol binario de tal manera en el arreglo que el nodo en la posición i es el padre de los nodos en las posiciones (2*i) y (2*i+1). El valor en un nodo es mayor o igual a los valores de sus hijos. Por consiguiente, el nodo padre tiene el mayor valor de todo su subárbol
Heap Sort consiste esencialmente en:
convertir el arreglo en un heap construir un arreglo ordenado de atrás hacia adelante (mayor a menor) repitiendo los siguientes pasos: sacar el valor máximo en el heap (el de la posición 1) poner ese valor en el arreglo ordenado reconstruir el heap con un elemento menos utilizar el mismo arreglo para el heap y el arreglo ordenado.
Estructura de datos abstracta: ßAGREGA, BORRAMIN, VACIA e INICIA (1) INICIA( S); (2) for( cada elemento, x, a ordenar ) (3) AGREGA( x, S ); (4) while( !VACIA(S) ) { (5) y = BORRA_MIN(S); (6) printf(" ... ", y ); (7) } Si las operaciones VACIA e INICIA toman un tiempo O(1) y las operaciones AGREGA y BORRA_MIN toman un tiempo O(logn), donde n es el número de elementos a ordenar, es claro que el método de ordenamiento anterior tomaría un tiempo ti empo O(nlogn).
Árbol Parcialmente Ordenado Un árbol parcialmente ordenado cumple con las l as siguientes propiedades: El valor de un nodo en el árbol no es mayor que el de sus hijos Un árbol parcialmente ordenado se puede representarse mediante un arreglo unidimensional, A, en el cual La raíz es A[1], y Los hijos del nodo A[i] son A[2i] y A[2i+1]
Nota: Si n es el número de elementos del arreglo, ën/2û son nodos interiores del árbol binario. FSólo los nodos interiores se deben considerar para ordenar el árbol en forma parcial.
HeapSort: Descenso. Supongamos que los elementos A[i], . . . ,A[j] obedecen ya la propiedad de los árboles parcialmente ordenados, excepto posiblemente por A[i]. La función siguiente desciende a A[i] hasta que se obtenga la propiedad de los l os árboles parcialmente ordenados. void desciende( int A, int i, int j ) { int r; r = i; while( r <= j/2) { if ( 2*r+1 > j ) { /* r tiene sólo un hijo */ if ( comp( A[r], A[2*r]) > 0 ) intercambia ( &A[r], &A[2*r] ); r = j; } else { /* r tiene dos hijos */ if ( comp( A[r], A[2*r] ) > 0 && comp( A[2*r], A[2*r+1] ) <= 0 ) { intercambia( &A[r], &A[2*r] ); r = 2*r; } else if ( comp( A[r], A[2*r+1] ) > 0 && comp( A[2*r+1], A[2*r] ) <= 0 ) { intercambia( &A[r], &A[2*r+1] ); r = 2*r+1; } else /* no se viola la propiedad de los árboles parcialmente ordenados */ r = j; } }
HeapSort, cont. A[1] árbol parcialmente ordenado A[n-k+1] > A[n-k+2] . . .A[n-k] A[n-k+1] A[ n] arreglo en orden no creciente > > A[n] void HeapSort( A, n ) .. { int i; for( i = n/2; i >= 1; i-i -- ) /* Inicialmente, establece la propiedad del árbol parcialmente ordenado */ desciende ( A, i, n); for( i = n; i >= 1; i-i- - ) { /* Quita el menor elemento */ intercambia( &A[1], &A[i] ); /* reestablece el árbol parcialmente ordenado */ desciende( A, 1, i-1 ); } }
CONCLUSIONES
La principal ventaja de ese método de ordenamiento es su eficiencia en su tiempo de ejecución el cual es . La eficiencia de la memoria, a diferencia de otros , ya que su algoritmo no es recursivo. métodos Este método es conveniente cuando se trata de ordenar arreglos estáticos grandes a diferencia de otros otros métodos como como Quiksort y Mergesort.
RECOMENDACIONES
Utilizar de manera correcta el algoritmo de búsqueda. Es recomendable aplicar este método cuando exista poca cantidad de elementos a ordenar. En un método recomendable para elementos aleatorios ya que es uno de los mas rapidos para N elementos.
Bibliografía Y. Langsam, M. J. Augenstein, A. Tenenbaum. Data Structures using C and C++ . Prentice Hall, Second edition. ISBN 0-13-036997-7. http://en.wikipedia.org/wiki/Sorting_algorithm