Fecha: 30 de mayo de 2012 Inacap Temuco Inenier!a en inform"tica Anlisis de algoritmos Heapsort Ordenamiento por montculos Introduccin La Ordenacin de la informacin de forma eficiente y eficaz es algo que se ha buscado por muchos tiempo con el fin de obtener un menor tiempo de ociosidad de una programa de ordenacin, pero no obstante en esta oportunidad podremos hablar de un en particular el cual es HeapSort, entre los diversos que existen, mencionando un poco de historia, funcionamiento y comparando el mtodo con otro de las mismas caracter!sticas " HeapSort #$lgorithm %&%# en la revista #'ommunications of the $'(# en )*+,- Se han hecho numerosos estudios sobre clasificacin- Los m.s relevantes son el de /-'- Hos0en en )*11, el realizado por 2-H- 3riend en )*1+ titulado Sorting on 2lectronic 'omputer System con descripcin detalladas de muchos algoritmos de Ordenacin interna y externa, introduciendo nuevos mtodos como la seleccin en .rbol- 4 por 5ltimo, el estudio de clasificacin preparado por 6-7- 6avies en )*1+- $ partir de entonces se fueron descubriendo nuevos mtodos de clasificacin8 c.lculo de direccin 9)*1+:, insercin por intercalacin 9)*1*:, radix por intercambio 9)*1*:, clasificacin por disminucin de Shell 9)*1*:, ;uic0sort de Hoare 9)*+%:, Heapsort de 7illiams 9)*+,:- Lo mencionado da paso a explicar las dem.s caracter!sticas de este algoritmo en el presente informe- <'mo funciona HeapSort= 2s una algoritmo de ordenacin por mont!culo, es un .rbol equilibrado, binario y >ustificado a la izquierda en el que ning5n nodo tiene un valor mayor que el valor de su padre- ?n heap es un arreglo $ con valores- @epresenta un .rbol binario completo que cumple8 $Apadre9i:B $AiB y est. constituido de la siguiente forma8 " $A)B contiene la ra!z " $A%iB y $A%iC)B contienen respectivamente los hi>os izquierdos y derechos de $AiB $AiD%B contiene al padre de $AiB- Eodo camino de una ho>a a la ra!z es una secuencia ordenada linealmente Operaciones sobre un heap8 Insertar, ;uitar el mayor, @eemplazar elementos a un heap- Eodos estos requieren menos de % logF comparaciones-
?n elegante y eficiente mtodo de ordenamiento sale de utilizar las operaciones sobre heap- $dem.s no usa memoria extra- Simplemente se construye un heap con los elementos a ordenar y despus se van quitando en el orden- Heapsort entonces requiere menos de %FlogF comparaciones ?n heap tiene las siguientes tres propiedades8 2s completo, esto es, las ho>as de un .rbol est.n en a lo m.ximo dos niveles adyacentes, y las ho>as en el 5ltimo nivel est.n en la posicin del extremo izquierdo- 'ada nivel en un heap es llenado en orden de izquierda a derecha- 2st. parcialmente ordenado, esto es, un valor asignado, llamado key del elemento almacenado en cada nodo 9llamado primario:, es menor que 9mayor que: o igual a las llaves almacenadas en los hi>os de los nodos izquierdo y derecho- 2l mtodo de ordenamiento procede de la siguiente manera8 # Golcar los datos de un vector en un mont!culo e ir comparando los valores con el fin de que el valor m!nimo o m.ximo del arreglo 9dependiendo de cmo se quiera ordenar: se posicione en la cima de este- # Luego se toma el valor de la cima del mont!culo y se regresa al arreglo en la 5ltima posicin- Ordenacin en im.genes8 2stos procedimientos quedan explicados de me>or manera en la secuencia de im.genes, que muestra el e>emplo a continuacin8 " La idea de este e>emplo es ordenar los valores de menor a mayor en el arreglo, por lo tanto los valores se organizar.n sacando los valores mayores y ponindolos en la 5ltima posicin del vector- )-" 2stos ser.n los valores del vector con el que se traba>ar.- %-" Se comienza a ingresar los datos en el mont!culo, un padre solo puede tener % hi>os- &-" Se comparan el valor del nodo padre con el del nodo hi>o como se muestra en la imagen a continuacin- &-)-" 2n este caso no hay cambios ya que el valor del padre es mayor al del nodo hi>o, por lo que se sigue con el procedimiento de ingreso de valores- 'on el nuevo nodo ingresado, al igual como en el paso anterior se comparan los valores entre padre e hi>o- &-%-" 'omo en el caso anterior, nuevamente no hay cambio, pero ahora seg5n el arreglo se procede a ingresar un valor mayor, es decir, hay un cambio en el mont!culo-
&-&-" 4a que el nuevo nodo hi>o posee un valor mayor al nodo padre, se crea un intercambio, quedando el nodo padre como nodo hi>o y el nodo hi>o como nodo padre- Fuevamente se repite la comparacin con el valor de cima, pero ahora si existe un intercambio-
&-,-" 2ste procedimiento se repite hasta que todos los valores estn ingresados en el mont!culo-
&-1-" $l terminar de almacenar los datos se procede a reingresar los datos en el vector, y rea>ustar los valores en el mont!culo-
&-+-" Luego de reposicionar el valor de los pies del mont!culo en la cima, se procede a hacer las comparaciones para que el valor m.ximo quede en el tope nuevamente, esto se muestra en la secuencia a continuacin-
&-H-" 2ste procedimiento se repite hasta que el vector este lleno nuevamente-
<6nde se usa= Heapsort se utiliza en la ordenacin en arreglos, mediante .rbol binario- 'omparacin de pares La siguiente tabla comparativa muestra tiempos de e>ecucin 9en segundos de 'I?: para ordenar listas con distintos mtodos- Los programas est.n escritos en 3ortran *J, y se us una computadora con procesador de %-K LHz- 6e velocidad con ) Lb- de memoria @$(- Garias de las subrutinas usadas en esta implementacin aparecen en A1B- Iara n M )JJJJ, es decir, una lista de )JJJJ elementos, los algoritmos shell, heapsort y quic0sort son tan veloces que no se alcanza a percibir el tiempo que tarda- 'omo era de esperarse, el mtodo m.s lento es bubble- Iara n M 1JJJJ y n M )JJJJJ las diferencias entre los mtodos comienzan a ser m.s claras, siendo los m.s lentos bubble, selection e insertion, y los m.s r.pidos shell, quic0sort y heapsort- Iara poder ver me>or las diferencias entre los mtodos m.s r.pidos, aumentamos el n5mero de elementos de la lista 9notar que en el cuadro comparativo no aparecen los tiempos de e>ecucin para los mtodos lentos pues estos tiempos son enormes:- 'laramente observamos que el mtodo quic0sort es el m.s veloz, seguido por el mtodo shell y heapsort- Las listas de n5meros a ordenar fueron construidos utilizando un generador aleatorio de n5meros reales- Orden de comple>idad " 2s conocido como el algoritmo de clasificacin tradicional- " Heapsort siempre es O 9n log n:- " ;uic0sort es por lo general O 9n log n:, pero en el peor de los casos reduce a O 9n%:- " ;uic0sort es generalmente m.s r.pido, pero Heapsort es me>or en aplicaciones de tiempo cr!tico- " Heapsort es un algoritmo muy bueno- Lr.fico representativo de $n.lisis del cdigo void heapsort ( int nmero [ ] , int tamanio_arreglo ) { int i, temperatura;
para ( i = ( tamanio_arreglo / 2 ) ; i> = 0 ; i ) { si!t"o#n ( nmeros, i, $%%$&_'()* + ) ; ,
para ( i = tamanio_arreglo + ; i> = + ; i ) { / / Cambio (reali-a inter.am/ios .on m0todo de s#ap) temporal = nmero [ 0 ] ; los nmeros [ 0 ] = nmero [ i ] ; nmeros de [ i ] = temp;
si!t"o#n ( nmeros, 0 , i + ) ; , ,
void si!t"o#n ( int nmero [ ] , int rai-, int a/a1o ) { int ma23hild = root 4 2 5 + ;
/ / Buscar el mayor hijo si ( ma23hild 6in!erior ) { int other3hild ma23hild = 5 + ; / / invertido para la estabilidad ma23hild = ( nmeros [ other3hild ] > 7meros [ ma23hild ] ) other3hild8 ma23hild; , m9s { / / No t desbordamiento si ( ma23hild> a/a1o ) de retorno ; , / / Si tenemos el orden correcto, hemos terminado. si ( los nmeros [ root ] > = nmero [ ma23hild ] ) volver9 ;
/ / Cola de recursin de cola. Sern compilados como un lao con los interruptores de compilacin adecuadas. si!t"o#n ( nmeros, ma23hild, a/a1o ) ; , 'onclusin 2n una constante b5squeda de la informacin, con el fin de clarificar las dudas respectivas, podemos acotar que podemos decir que un heap binario es correcto si y solo si los nodos padre son siempre mayores a los nodos hi>os- @ecuerde que el heap binario es un .rbol binario almacenado en un arreglo- 'on el fin de obtener informacin ordenada para su previo uso y con un comple>idad de O 9n log n:-