0% encontró este documento útil (0 votos)
113 vistas27 páginas

HeapSort QuickSort Anotado

El documento describe dos algoritmos de ordenamiento, HeapSort y QuickSort. HeapSort usa una estructura de montículo para ordenar elementos de forma eficiente en tiempo O(n log n). QuickSort divide el arreglo de forma recursiva en subarreglos menores hasta ordenarlos. Ambos algoritmos tienen un tiempo de ejecución promedio de O(n log n).

Cargado por

Lancelot UwU
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
113 vistas27 páginas

HeapSort QuickSort Anotado

El documento describe dos algoritmos de ordenamiento, HeapSort y QuickSort. HeapSort usa una estructura de montículo para ordenar elementos de forma eficiente en tiempo O(n log n). QuickSort divide el arreglo de forma recursiva en subarreglos menores hasta ordenarlos. Ambos algoritmos tienen un tiempo de ejecución promedio de O(n log n).

Cargado por

Lancelot UwU
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

Sede Tuluá

HeapSort y QuickSort

Fundamentos de Análisis y Diseño de Algoritmos


Montículo (Heap)
Sede Tuluá

► El algoritmo HeapSort está basado en la estructura de un montículo.

1 2 3 4 5 6 7 8 9 10
Montículo (Heap)
Sede Tuluá

► Es un arreglo de objetos que puede ser


visto como un árbol binario completo.

► Deben cumplir dos propiedades:


• Propiedad de Orden
• Propiedad de forma

1 2 3 4 5 6 7 8 9 10
Montículo (Heap)
Sede Tuluá

► Es un arreglo de objetos que puede ser visto


como un árbol binario completo.

► Deben cumplir dos propiedades:


• Propiedad de Orden:
• La raíz del árbol tiene la llave de menor valor en 
todo el árbol: Montículo mínimo. (La regla se 
cumple recursivamente en los subárboles)
• La raíz del árbol tiene la llave de mayor valor en 
todo el árbol: Montículo máximo. (La regla se 
cumple recursivamente en los subárboles)

• Propiedad de forma:
• Las hojas tienen altura h o h-1, donde h es la altura 
del árbol. Cuando una hoja tiene altura h-1, todas 
las hojas hacia la derecha tendrán la misma altura.
Montículo (Heap)
Sede Tuluá

► Un arreglo A que representa un montículo tiene dos atributos:


• length[A]: Número de elementos en el arreglo
• heap­size[A]: Número de elementos en el montículo.

1 2 3 4 5 6 7 8 9 10
1                       2                      3                     4                      5                      6          7                      8                      9                   10

► Así, se cumplen las siguientes propiedades:


• heap­size[A] ≤ legth[A] 
• La raíz del árbol es A[1]
Dado el índice i de un nodo:
• Parent[i] = floor(i/2)
• Left[i] = 2.i
• Right[i] = 2.i + 1
Max-Heapify
Sede Tuluá

► Este algoritmo permite garantizar la propiedad de orden de un montículo


máximo.
Inserción en Montículos
Sede Tuluá

► La inserción en un montículo implica agregar el nodo en el último


nivel del árbol, completándolo de izquierda a derecha.

► Si el montículo es máximo, se debe garantizar que las raíces tengan


el nodo de mayor valor.
Creación en Montículos
Sede Tuluá

► La creación de un montículo a partir de un arreglo, garantiza la


propiedad de forma almacenando los datos de izquierda a derecha y
no se pueden pasar los elementos al siguiente nivel hasta que el nivel
anterior esté lleno.

► Si el montículo es máximo, se invoca el procedimiento Max-Heapify,


desde la última raíz hasta la raíz del árbol, garantizando la propiedad
de orden.
Eliminación en Montículos
Sede Tuluá

► Solamente es posible eliminar la raíz del montículo.

► Se toma el elemento de la posición que debe quedar vacía, colocándolo en la


raíz (así cumpliendo la propiedad de árbol completo), y luego intercambiar
ese valor con el máximo de sus hijos hasta satisfacer la propiedad de
montículo (si es de máximos)
Algoritmo HeapSort
Sede Tuluá

► Es un algoritmo de ordenamiento basado en comparaciones de


elementos que utiliza un heap para ordenarlos.

► Es un algoritmo de ordenamiento no recursivo, con complejidad O(n


log n).

► El ordenamiento Heapsort consiste en almacenar todos los elementos


del vector a ordenar en un montículo y luego extraer el nodo que
queda como raíz en sucesivas iteraciones obteniendo el conjunto
ordenado.
Algoritmo HeapSort
Sede Tuluá

► Ejemplo: Ordenar la siguiente sucesión:


Algoritmo HeapSort
Sede Tuluá

► Etapa 1: Organizar el arreglo de entrada como un montículo

98 89 657 7 82 4 65 91 3

897
98 657
7 82 4 65
1 3
Algoritmo HeapSort
Sede Tuluá

► Etapa 2: El elemento en la cima del heap se elimina del árbol (se


ubica en la posición final del arreglo). El resto del arreglo se organiza
restituyendo el orden del heap de repite hasta que el arbol queda sin
elementos.

8 7 657 3 82 4 65 91 9

8
7 657
3 82 4 65
1
Algoritmo HeapSort
Sede Tuluá

► Etapa 2 (Continuación)

7 3 657 1 82 4 65 8 9

7
3 657
1 82 4 65
Algoritmo HeapSort
Sede Tuluá

► Etapa 2 (Continuación)

6 3 5 1 82 4 7 8 9

6
3 5
1 82 4
Algoritmo HeapSort
Sede Tuluá

► Etapa 2 (Continuación): El procedimiento sigue hasta tener un


montículo vacío.

1 2 3 4 5 6 7 8 9

1
► ARREGLO ORDENADO:

1 2 3 4 5 6 7 8 9
Algoritmo HeapSort
Sede Tuluá

► Heapsort(A)
Build_Heap(A)
for (i= lenght(A) downto 2 ) do
exchange A[1 <-> A[i
heap_size [A = heap_size [A-1
Heapify(A,1)
Colas de Prioridad
Sede Tuluá

► Aplicación de montículos.

► Estructura de datos con un campo llave (key) que determina la prioridad.

► Operaciones de un cola de prioridad máxima:


• Insert(S, x)
• Maximum(S)
• Extract­Max(S)
• INCREASE­KEY(S,x,k)
Algoritmo QuickSort
Sede Tuluá

► Basado en Dividir y Conquistar

► Pasos:
• Dividir: el arreglo se particiona en dos sub­arreglos no vacíos, tal que 
cada elemento de un sub­arreglo sea menor o igual a los elementos del 
otro sub­arreglo. 
• Conquistar: los dos arreglos son ordenados llamando recursivamente a 
quicksort.
• Combinar: Como cada arreglo ya está ordenado, no serequiere trabajo 
adicional.
Algoritmo QuickSort
Sede Tuluá

Partition(A,p,r) {
x=A[p];
i=p­1;
Quicksort(A,p,r){ j=r+1;
if (p<r) { while(1) {
q = Partition(A,p,r); do   j­­;
Quicksort(A,p,q); until (A[j]  x)
Quicksort(A,q+1, r); do  i++;
} until (A[i]  x)
} if (i < j)
exchange A[i] <­> A[j];
else
return j;
}
}
Algoritmo QuickSort
Sede Tuluá

► Ejemplo: Ordenar la sucesión 5|3|2|6|4|1|3|7

► Proceso:

5|3|2|6|4|1|3|7 5|3|2|6|4|1|3|7
i j i j

3|3|2|6|4|1|5|7 3|3|2|6|4|1|5|7
i j i j

3|3|2|1|4|6|5|7 3|3|2|1|4|6|5|7
i j j i Retorna j
Algoritmo QuickSort
Sede Tuluá

Tiempos de Ejecución:

► Peor caso: Ocurre cuando el arreglo es particionado en n-1 y 1


elemento cada vez.
En este caso se tiene:

T(n)=T(n-1) + (n) = (n2)

► Mejor caso: Ocurre cuando Partition produce dos regiones de igual


tamaño. En este caso se tiene: T(n)=2T(n/2)+ (n) , de lo cual resulta
T(n) = (n lg n)

► Caso Promedio: T(n)= (n lg n)


Preguntas
Sede Tuluá

También podría gustarte