Anda di halaman 1dari 10

Heapsort

Heapsort es una comparacin basada en el algoritmo de clasificacin para crear una matriz ordenada (o lista), y es parte de la ordenacin por seleccin de la familia. Aunque algo ms lenta en la prctica en la mayora de las mquinas de un bien implementado quicksort , tiene la ventaja de una ms favorable del peor caso de O (n log n) tiempo de ejecucin. Heapsort es un algoritmo en el lugar , pero no es un tipo estable .

Clase Estructura de datos Peor de los casos el rendimiento Mejor de los casos el rendimiento El rendimiento promedio de los casos Peor de los casos la complejidad del espacio

Algoritmo de clasificacin Matriz

[1]

total,

auxiliar

Heapsort es un algoritmo de dos pasos. El primer paso consiste en construir un montn de los datos. La segunda etapa comienza con la eliminacin del elemento ms grande de la pila. Insertamos el elemento eliminado en la matriz ordenada. Para el primer elemento, esto sera la posicin 0 de la matriz. A continuacin se reconstruye la pila y quitar el elemento ms prximo, y la inserta en la matriz. Despus de haber eliminado todos los objetos del montn, tenemos un arreglo ordenado. Se puede variar la direccin de los elementos ordenados por la eleccin de un montn o min-max heap en el paso uno. Heapsort se puede realizar en su lugar. La matriz se puede dividir en dos partes, la matriz ordenada y el montn. El almacenamiento de los vertederos de las matrices como se esquematiza en la pila de la aplicacin binaria # montn . invariantes El montn se conserva despus de cada extraccin, por lo que el nico coste es el de la

extraccin. Heapsort utiliza dos operaciones del montn: insercin y eliminacin de la raz. Heapsort principalmente compite con quicksort , otra de uso general muy eficiente prcticamente en el lugar de comparacin basado en el algoritmo de ordenacin. Quicksort es generalmente un poco ms rpido, debido a un mejor comportamiento de la cach y otros factores, pero el tiempo de ejecucin del peor caso de quicksort es O (n 2),lo cual es inaceptable para los grandes conjuntos de datos y puede ser provocado deliberadamente dado el conocimiento suficiente de la aplicacin, la creacin de un riesgo de seguridad. Ver quicksort para una discusin detallada de este problema, y las posibles soluciones. Por lo tanto, a causa de la O (n log n) lmite superior en tiempo de ejecucin de heapsort y constante en su lmite superior de almacenamiento auxiliar, los sistemas integrados con restricciones de tiempo real o sistemas relacionados con la seguridad a menudo utilizan heapsort. Heapsort tambin compite con tipo de mezcla , que tiene los lmites mismo tiempo, pero requiere (n) el espacio auxiliar, mientras que heapsort requiere solamente una cantidad constante. Heapsort tambin suele ejecutar con mayor rapidez en la prctica en las mquinas con pequeos o lentos cachs de datos . Por otro lado, fusionar especie tiene varias ventajas sobre heapsort:

Al igual que el quicksort, merge sort en arrays tiene un rendimiento considerablemente mejor cach de datos, a menudo superando heapsort en un PC de escritorio moderno, debido a que tiene acceso a los elementos en orden. Combinar tipo es una ordenacin estable . Combinar tipo paralelizar mejor , la forma ms trivial de paralelizacin tipo de mezcla alcanza cerca de aceleracin lineal , mientras que no hay ninguna manera obvia de poner en paralelo heapsort en absoluto. Combinar tipo puede ser fcilmente adaptado para funcionar en las listas enlazadas (con O (1) espacio adicional [7] ) y las listas de gran tamao almacenados en los medios de comunicacin que demora en el acceso como el almacenamiento en disco o almacenamiento conectado a red . Heapsort se apoya fuertemente en el acceso aleatorio , y su pobre localidad de referencia hace que sea muy lento en los medios de comunicacin con los tiempos de acceso largos. (Nota: heapsort tambin se puede aplicar a listas doblemente enlazadas con slo O (1) sobrecarga de espacio adicional)

Algoritmo es una alternativa interesante que combina heapsort quicksort y heapsort para retener las ventajas de ambos: el peor caso de heapsort velocidad y la velocidad media de la ordenacin rpida. Pseudocdigo

El siguiente es el "simple" manera de implementar el algoritmo en pseudocdigo . Las matrices son de base cero y de intercambio se utiliza para intercambiar dos elementos de la matriz. Movimiento de "abajo" significa desde la raz hacia las hojas, o de la reduccin de los ndices a una mayor. Tenga en cuenta que durante la ordenacin, el

elemento ms grande est en la raz de la pila en un [0], mientras que al final de la clase, el elemento ms grande se encuentra en una [final]. funcin de heapsort (a, recuento) es de entrada: una serie desordenada de un recuento de la longitud (El primero en poner un max-heap fin) heapify (uno, el recuento) final: = Count-1 / / en las lenguas con matrices de base cero que los nios son de 2 * i +1 y 2 * i +2 mientras que el extremo> 0 hacer (Cambiar el directorio raz (valor mximo) de la pila con el ltimo elemento de la pila) swap (una [final], a [0]) (Disminuir el tamao de la pila por una manera que el valor mximo anterior se permanecer en su colocacin correcta) fin: = fin - 1 (Poner la pila de nuevo en max-heap fin) siftDown (uno, 0, final)

funcin de heapify (a, recuento) es (Inicio se le asigna el ndice de un nodo principal de la ltima) inicio: = (recuento - 2) / 2 al mismo tiempo empezar a hacer 0 (Tamizar el nodo al inicio de ndice para el lugar adecuado de tal manera que todos los nodos por debajo de el ndice de inicio estn en orden montn) siftDown (un comienzo, cuenta-1) comienzo: = comienzo - 1 (Despus de tamizar por la raz de todos los nodos o elementos estn en orden montn) siftDown funcin (a, inicio, fin) es de entrada: final representa el lmite de hasta dnde abajo del montn para tamizar. raz: = inicio mientras que la raz * 2 + 1 final hacer (mientras que la raz tiene al menos un hijo) nio: = root * 2 (la raz * 2 + 1 puntos del hijo de la izquierda) + 1 swap: = raz (mantiene un registro de nios para intercambiar con)

(Comprobar si la raz es menor que hijo de la izquierda) si un [de intercambio] <a [nio] swap: = hijo (Marque si el nio derecho existe, y si es ms grande que lo que estamos actualmente con el intercambio) si el nio un extremo y un [de intercambio] <a [un nio] swap: = + 1 nio (Comprobar si tenemos que cambiar en absoluto) si es de intercambio! = raz swap (una [root], a [cambiar]) raz: = swap (repita para continuar tamizado por el nio ahora) ms volver Ejemplo Sea {6, 5, 3, 1, 8, 7, 2, 4} es la lista que queremos ordenar de menor a mayor. (NOTA, de "Construccin del montn 'paso: grandes nodos no se quedan por debajo de los padres menores de nodos Ellos se intercambian con los padres, y luego recursivamente comprobar si otro de intercambio es necesario, para mantener un mayor nmero por encima de un nmero menor en el rbol binario montn. .) VER GIF:

Un ejemplo de heapsort.

1. Construya el montn

Montn

elemento recin aadido intercambiar elementos

Cero

6, 5

6, 5, 3

6, 5, 3,1

6, 5, 3, 1, 8

5, 8

6, 8, 3, 1, 5

6, 8

8, 6, 3, 1, 5

8, 6, 3, 1, 5, 7

3, 7

8, 6, 7, 1, 5, 3

8, 6, 7, 1, 5, 3, 2

8, 6, 7, 1, 5, 3, 2, 4

1, 4

8, 6, 7, 4, 5, 3, 2, 1 2. Clasificacin. intercambiar elementos eliminar los elementos matriz ordenada

Montn

detalles

8, 6, 7, 4, 5, 8, 1 3, 2, 1

intercambiar 8 y 1 con el fin de eliminar 8 de almacenamiento dinmico

1, 6, 7, 4, 5, 3, 2, 8

eliminar 8 de pila y aadir a la matriz ordenada

1, 6, 7, 4, 5, 1, 7 3, 2

intercambiar 1 y 7, ya que no estn en orden en el montn

7, 6, 1, 4, 5, 3, 2

1, 3

intercambiar 1 y 3, ya que no estn en orden en el montn

7, 6, 3, 4, 5, 7, 2 1, 2

intercambiar 7 y 2 con el fin de eliminar 7 de montn

2, 6, 3, 4, 5, 1, 7

eliminar 7 de pila y aadir a la matriz ordenada

2, 6, 3, 4, 5, 2, 6 1

7, 8

cambiar el 2 y 6, ya que no estn en orden en el montn

6, 2, 3, 4, 5, 1

2, 5

7, 8

cambiar el 2 y 5, ya que no estn en orden en el montn

6, 5, 3, 4, 2, 1

6, 1

7, 8

intercambiar 6 y 1 con el fin de eliminar 6 de montn

1, 5, 3, 4, 2, 6

7, 8

eliminar 6 de pila y aadir a la matriz ordenada

1, 5, 3, 4, 2

1, 5

6, 7, 8

intercambiar 1 y 5, ya que no estn en orden en el montn

5, 1, 3, 4, 2

1, 4

6, 7, 8

intercambiar 1 y 4, ya que no

estn en orden en el montn

5, 4, 3, 1, 2

5, 2

6, 7, 8

intercambiar 5 y 2 con el fin de eliminar 5 de montn

2, 4, 3, 1, 5

6, 7, 8

eliminar 5 de la pila y aadir a la matriz ordenada

2, 4, 3, 1

2, 4

5, 6, 7, 8

cambiar el 2 y 4, ya que no estn en orden en el montn

4, 2, 3, 1

4, 1

5, 6, 7, 8

intercambiar 4 y 1 con el fin de eliminar 4 de montn

1, 2, 3, 4

5, 6, 7, 8

eliminar 4 de pila y aadir a la matriz ordenada

1, 2, 3

1, 3

4, 5, 6, 7, 8

intercambiar 1 y 3, ya que no estn en orden en el montn

3, 2, 1

3, 1

4, 5, 6, 7, 8

intercambiar 3 y 1 con el fin de eliminar 3 de montn

1, 2, 3

4, 5, 6, 7, 8

eliminar 3 de la pila y aadir a la matriz ordenada

1, 2

1, 2

3, 4, 5, 6, 7, intercambiar 1 y 2, ya que no 8 estn en orden en el montn

2, 1

2, 1

3, 4, 5, 6, 7, intercambiar 2 y 1 con el fin 8 de eliminar 2 de montn

1, 2

3, 4, 5, 6, 7, eliminar 2 de la pila y aadir 8 a la matriz ordenada

2, 3, 4, 5, 6, eliminar 1 de la pila y aadir 7, 8 a la matriz ordenada

1, 2, 3, 4, 5, terminado 6, 7, 8

El Heapsort est basado en el uso de un tipo especial de rbol binario (llamado apilamiento) para estructurar el proceso de ordenaiento. La estructura de ramificacin del rbol conserva el nmero de comparaciones necesarias en . La estructura de este rbol tiene las siguientes caractersticas: Las llaves estn acomodadas en los nodos de tal manera que, para cada nodo i, Ki <= Kj donde el nodo j es el padre del nodo i. Es decir, al recorrer el camino desde la raz hacia abajo, las claves se encuentran en orden descendente. El rbol se llena de izquierda a derecha, lo que implica que si algn(os) nodo(s) no est(n) en el mismo nivel que el resto, ste(os) estar(n) entonces lo ms a la izquierda posible del rbol. Veamos grficamente un ejemplo de este tipo de rbol:

Al enumerar los nodos por niveles, de izquierda a derecha (como se aprecia en la figura), no es necesario usar punteros para almacenar el rbol. En efecto, se puede usar un arreglo A[1..n], donde los hijos de A[i] son A[2*i] y A[2*i+1]. As, la condicin del Heap se puede reformular: A[i] > A[2*i] A[i] > A[2*i+1] Luego un vector con las llaves quedara de la siguiente forma: 73 - 50 - 36 - 21 - 46 - 27 - 9 - 18 - 10 - 30

Resumiendo, el ordenamiento por Heapsort realiza los siguientes pasos desde un punto de vista de un Heap (con los elementos) y una lista ordenada (inicialmente vaca): 1. Saca el valor mximo del Heap. (El de la posicin 1). 2. Pone el valor sacado en el arreglo ordenado. 3. Reconstruir el Heap con un elemento menos. El proceso de sacar el mximo (la raz) lleva en s una serie de pasos ms que son: ** Toma el elemento de la raz y lo intercambia con el elemento ms a la derecha de la rama que est en el nivel ms bajo. Recordemos que el rbol (Heap) se llena de izquierda a derecha, con lo cual, el proceso de sacar la raz se hace en forma inversa (Vaciando el rbol). ** Al intercambiar la raz con el elemento antes mencionado, se produce un quiebre en las condiciones del Heap, con lo cual se debe reconstruir y volver a dejar en la raz del rbol el elemento que es mayor que todos los dems. Un algoritmo sencillo para visualizar cmo funciona este mtodo de ordenamiento puede ser el siguiente: void HeapSort(Lista Numeros) { Heap=Construir_Heap(Numeros); while(Heap_vacio(Heap)==0) { Auxiliar=Extraer_Max(Heap); Insertar(Ordenada, Auxiliar); Ultimo=Ultimo_Heap(Heap); Numeros=Coloca_Cabeza(Ultimo,Numeros); Heap=Reconstruir_Heap(Heap); }; };

Otra forma de implementarlo sera la siguiente, realiza el proceso con un vector. void swap(int &a,int &b) { int temp=a; a=b; b=temp; } void HeapSort(Lista vec,int n) { int i,j; for (i=0;i<n;i++) { j=i+1;

while(j>1) if (vec[j-1]>vec[j/2-1]){ swap(vec[j-1],vec[j/2-1]); j/=2; } else break; } for(i=n-1;i>0;i--) { swap(vec[0],vec[i]); j=1; while (j*2<i) if (j*2+1>i) if (vec[j-1]>vec[j*2-1]) break; else{ swap(vec[j-1],vec[j*2-1]); j*=2; } else if (vec[j*2-1]>vec[j*2]) if (vec[j-1]>vec[j*2-1]) break; else{ swap(vec[j-1],vec[j*2-1]); j*=2; } else if (vec[j-1]>vec[j*2]) break; else{ swap(vec[j-1],vec[j*2]); j*=2+1; } } }

En promedio, el nmero requerido de comparaciones e intercambios para el Heap Sort es: lo cual es . En el peor de los casos, este nmero se incrementa a . El peor caso no es mucho peor que el caso promedio. El mtodo de ordenamiento por Heapsort garantiza un tiempo de proceso de . Para un tamao "n" muy grande, la complejidad del algoritmo est compensada por la eficiencia del mtodo.

Anda mungkin juga menyukai