SlideShare una empresa de Scribd logo
1
Ordenamiento y estadísticas de
orden
Agustín J. González
ELO 320: Estructura de Datos y
Algoritmos
2
Ordenamiento y Estadísticas de Orden
Problema de ordenamiento:
Entrada: Una secuencia de n números (a1,a2, ..., an)
Salida: Una permutación (a1´, a2´, a3´,...,an´) de la
entrada tal que a1´ a2´  a3´ ...  an´
Soluciones: Insertion-Sort, merge-sort, heapsort,
quicksort. ---> (n lg n)
La estadística de orden i-ésimo de un conjunto de n
números, es el i-ésimo número más pequeño.
---> O(n)
3
Heapsort
• La estructura de datos “heap” es un arreglo de objetos que
pueden ser vistos como un árbol binario completo.
• Ej.
1
6
1
4
1
0
7 9 3
8
1
4
2
16 |14 |10 | 8 | 7 | 9 | 3 | 2 | 4 | 1
4
Propiedades del heap
• El arreglo puede contener más entradas (=length(A)) que el heap
(=heap_size(A))
• Obviamente heap_size(A)  length(A)
• La raíz del árbol es A[1 (Con índices partiendo de 1)
• Dado un índice i de un nodo, su padre, hijo izquierdo e hijo derecho
son determinados como:
Parent(i)
return  i/2 
Left(i)
return 2i
Right(i)
return 2i+1
Estos procedimientos se pueden implementar como macros o código
“in-line”.
Propiedad heap : A [Parent(i) A [i para todo nodo diferente de la
raíz.
5
Procedimientos básicos usados en algoritmos de
ordenamiento y en colas de prioridad
• Heapify(A,i): Entrada: Left(i) y Right(i) son heaps, pero A[i puede ser menor
que sus hijos.
• Salida: Heapify mueve A[i hacia abajo para que al sub-árbol con raíz i sea un
heap.
Heapify(A,i)
le= Feft(i)
ri= Right(i)
if( le <= heap_size(A) && A[le > A[i )
largest = le
else
largest = i
if ( ri <= heap_size(A) && A[ri > A[largest )
largest = ri
if (largest != i)
exchange A[i <-> A[largest
Heapify(A, largest)
6
Análisis de tiempo de Ejecución
• T(n) = (1) + Tiempo de Heapify sobre uno de los sub-
árboles.
• El peor caso para el tamaño del sub-árbol es 2n/3. Éste
ocurre cuando la última fila está la mitad llena.
2n/3
n/3
T(n)  T(2n/3) + (1)
==> T(n) = O(lg n)
7
Construyendo el heap: Build_Heap
• La construcción del heap se logra aplicando la función heapify de manera
de cubrir el arreglo desde abajo hacia arriba.
• Notar que los nodos hojas, ya son heap. Éstos están en A[ (n/2+1) .. n.
• El procedimiento Build_Heap va a través de los nodos restantes y corre
heapify en cada uno.
Build_Heap(A) {
heap_size [A = length [A
for i = length(A) /2  downto 1
do Heapify(A,i)
}
4 | 1 | 3 | 2 | 16 | 9 | 10 | 14 | 8 | 7
Ejemplo:
8
Análisis del tiempo de ejecución
• Cada llamado a Heapify tiene un costo O(lgn) y como a lo más hay n
de estos llamados, una cota superior para el costo de Build_heap es
O(nlgn).
• Un mejor análisis conduce a O(n)
• ¿Cuántos nodos hay de altura h?
• Para nodos de altura h el costo de Heapify es O(h).
• Luego el costo es    
















 


n
h
h
n
h
h
h
n
O
O(h)
n lg
0
lg
0
1
2
2
2
)
2
/
1
1
(
2
/
1
2 2
0






h
h
h
)
(
2
2
n
O
:
por
acotado
ser
puede
Build_Heap
0
lgn
0
h
n
O
h
n
O
h
h
h
h






















n/2h+1
9
Algoritmo Heapsort
• 1.- Construir un heap invocando a Build_Heap
• 2.- Intercambiar el primer elemento, la raíz y mayor elemento, del heap
con el último.
• 3.- Restituir la propiedad heap en el heap de n-1 elementos.
Heapsort(A)
Build_Heap(A)
for (i= lenght(A) downto 2 ) do
exchange A[1 <-> A[i
heap_size [A = heap_size [A
Heapify(A,1)
• El costo de Heapsort es O(n lg n) porque el llamado a Build_Heap toma O(n)
y luego tenemos n-1 llamados a Heapify cuyo tiempo es O(lgn).
10
Colas de Prioridad
• Heapsort es muy bueno, pero es superado por quicksort (lo veremos
luego).
• La aplicación más popular de heapsort es para implementar colas de
prioridad.
• Una cola de prioridad es una estructura de datos que mantiene un
conjunto de S de elementos cada uno asociado con una clave key.
• La cola de prioridad soporta las siguientes operaciones:
Insert(S,x): inserta x en el conjunto S
Maximum(S): retorna el elemento con mayor clave.
Extract-Max(S): remueve y retorna el elemento con mayor clave.
• Aplicaciones:
-Itineración de tareas en sistemas de tiempo compartido
-Colas de prioridad en simuladores conducidos por evento (Event-
driven simulator)
11
Operaciones en Colas de prioridad
• Heap_Maximum(S): retorna el nodo raíz en tiempo (1).
• Heap_Extract_Max(A)
if heap_size[A] <1 then error “Heap undeflow”
max = A[1]
A[1] = A[heap_size [A]]
heap_size [A] = heap_size [A]]-1
Heapify(A,1)
return max
• Heap_Insert(A,key)
heap_size [A] = heap_size [A]+1
i = heap_size [A]
while (i > 1 and A[Parent(i)] < key) do
A[i] = A[Parent(i)]
i = Parent(i)
A[i] = key
Tiempo de Heap_Extract_Max : O(lg n) básicamente el tiempo de Heapify
Tiempo de Heap_Insert : O(lg n) porque es el recorrido desde la nueva hoja a la raíz.

Más contenido relacionado

PPT
Heap sort
PPT
Heap sort2
PDF
Pqueues
PDF
Pqueues
PPTX
Algoritmo por seleccion
PDF
PPTX
HeapSort
Heap sort
Heap sort2
Pqueues
Pqueues
Algoritmo por seleccion
HeapSort

Similar a heapsort.ppt (20)

PPT
13 heaps
PDF
Algoritmo de ordenamiento: Heap Sort
PPTX
Algoritmo de almacenamiento - Método Heap Sort
PPSX
Método Heap Sort
PPTX
Expo fibonacci
PPT
binarySearchTree.ppt
PPTX
algoritmo de ordenamiento.pptx
PPTX
Arboles y Colas de Prioridad en Java
DOCX
Metodo de Ordenamiento Heap Sort (Monticulo)
DOCX
Investigacion Formativa Heap Short (Monticulo).docx
PDF
Informe estructuras no lineales
PDF
Informe estructuras no lineales unidad 4
DOCX
Plan analitico estructura de datos
PPTX
Manejo de Estructura de Datos, Tipos, Beneficios
PPTX
Algoritmos para Ordenación, Búsqueda e Intercalación internas.pptx
PPTX
Ordenamiento con árbol binario
PDF
Algortimos De Ordenamiento
PPTX
PDF
Informe de Arboles.pdf
13 heaps
Algoritmo de ordenamiento: Heap Sort
Algoritmo de almacenamiento - Método Heap Sort
Método Heap Sort
Expo fibonacci
binarySearchTree.ppt
algoritmo de ordenamiento.pptx
Arboles y Colas de Prioridad en Java
Metodo de Ordenamiento Heap Sort (Monticulo)
Investigacion Formativa Heap Short (Monticulo).docx
Informe estructuras no lineales
Informe estructuras no lineales unidad 4
Plan analitico estructura de datos
Manejo de Estructura de Datos, Tipos, Beneficios
Algoritmos para Ordenación, Búsqueda e Intercalación internas.pptx
Ordenamiento con árbol binario
Algortimos De Ordenamiento
Informe de Arboles.pdf
Publicidad

Más de jlmansilla (10)

PPT
NTFSFS.ppt
PPT
maximumFlow.ppt
PPT
NTFS.ppt
PPT
LinearSortOrderSatatistics.ppt
PPT
hashing.ppt
PPT
elementaryAlgorithms.ppt
PPT
greedy.ppt
PPT
NP_Completitud.ppt
PPT
BasicC++.ppt
PPTX
PERDIDA_EN_UNA_RED_DE_FIBRA_OPTICA.pptx
NTFSFS.ppt
maximumFlow.ppt
NTFS.ppt
LinearSortOrderSatatistics.ppt
hashing.ppt
elementaryAlgorithms.ppt
greedy.ppt
NP_Completitud.ppt
BasicC++.ppt
PERDIDA_EN_UNA_RED_DE_FIBRA_OPTICA.pptx
Publicidad

Último (10)

PPTX
Tratará sobre Grafos_y_Arboles_Presentacion.pptx
PDF
Su punto de partida en la IA: Microsoft 365 Copilot Chat
PPTX
Fundamentos de Python - Curso de Python dia 1
PPTX
Implementación equipo monitor12.08.25.pptx
PPTX
sistemas de informacion.................
PDF
AutoCAD Herramientas para el futuro, Juan Fandiño
PPTX
Conceptos basicos de Base de Datos y sus propiedades
PPTX
ORIGEN DE LA IA - GRADO 1102 INTELIGENCIA
DOCX
trabajo programacion.docxxdxxxddxdxxdxdxxxdxxdxdxd
PDF
Clase 3 - Presentación visual (Insertando objetos visuales) POWER POINT.pdf
Tratará sobre Grafos_y_Arboles_Presentacion.pptx
Su punto de partida en la IA: Microsoft 365 Copilot Chat
Fundamentos de Python - Curso de Python dia 1
Implementación equipo monitor12.08.25.pptx
sistemas de informacion.................
AutoCAD Herramientas para el futuro, Juan Fandiño
Conceptos basicos de Base de Datos y sus propiedades
ORIGEN DE LA IA - GRADO 1102 INTELIGENCIA
trabajo programacion.docxxdxxxddxdxxdxdxxxdxxdxdxd
Clase 3 - Presentación visual (Insertando objetos visuales) POWER POINT.pdf

heapsort.ppt

  • 1. 1 Ordenamiento y estadísticas de orden Agustín J. González ELO 320: Estructura de Datos y Algoritmos
  • 2. 2 Ordenamiento y Estadísticas de Orden Problema de ordenamiento: Entrada: Una secuencia de n números (a1,a2, ..., an) Salida: Una permutación (a1´, a2´, a3´,...,an´) de la entrada tal que a1´ a2´  a3´ ...  an´ Soluciones: Insertion-Sort, merge-sort, heapsort, quicksort. ---> (n lg n) La estadística de orden i-ésimo de un conjunto de n números, es el i-ésimo número más pequeño. ---> O(n)
  • 3. 3 Heapsort • La estructura de datos “heap” es un arreglo de objetos que pueden ser vistos como un árbol binario completo. • Ej. 1 6 1 4 1 0 7 9 3 8 1 4 2 16 |14 |10 | 8 | 7 | 9 | 3 | 2 | 4 | 1
  • 4. 4 Propiedades del heap • El arreglo puede contener más entradas (=length(A)) que el heap (=heap_size(A)) • Obviamente heap_size(A)  length(A) • La raíz del árbol es A[1 (Con índices partiendo de 1) • Dado un índice i de un nodo, su padre, hijo izquierdo e hijo derecho son determinados como: Parent(i) return  i/2  Left(i) return 2i Right(i) return 2i+1 Estos procedimientos se pueden implementar como macros o código “in-line”. Propiedad heap : A [Parent(i) A [i para todo nodo diferente de la raíz.
  • 5. 5 Procedimientos básicos usados en algoritmos de ordenamiento y en colas de prioridad • Heapify(A,i): Entrada: Left(i) y Right(i) son heaps, pero A[i puede ser menor que sus hijos. • Salida: Heapify mueve A[i hacia abajo para que al sub-árbol con raíz i sea un heap. Heapify(A,i) le= Feft(i) ri= Right(i) if( le <= heap_size(A) && A[le > A[i ) largest = le else largest = i if ( ri <= heap_size(A) && A[ri > A[largest ) largest = ri if (largest != i) exchange A[i <-> A[largest Heapify(A, largest)
  • 6. 6 Análisis de tiempo de Ejecución • T(n) = (1) + Tiempo de Heapify sobre uno de los sub- árboles. • El peor caso para el tamaño del sub-árbol es 2n/3. Éste ocurre cuando la última fila está la mitad llena. 2n/3 n/3 T(n)  T(2n/3) + (1) ==> T(n) = O(lg n)
  • 7. 7 Construyendo el heap: Build_Heap • La construcción del heap se logra aplicando la función heapify de manera de cubrir el arreglo desde abajo hacia arriba. • Notar que los nodos hojas, ya son heap. Éstos están en A[ (n/2+1) .. n. • El procedimiento Build_Heap va a través de los nodos restantes y corre heapify en cada uno. Build_Heap(A) { heap_size [A = length [A for i = length(A) /2  downto 1 do Heapify(A,i) } 4 | 1 | 3 | 2 | 16 | 9 | 10 | 14 | 8 | 7 Ejemplo:
  • 8. 8 Análisis del tiempo de ejecución • Cada llamado a Heapify tiene un costo O(lgn) y como a lo más hay n de estos llamados, una cota superior para el costo de Build_heap es O(nlgn). • Un mejor análisis conduce a O(n) • ¿Cuántos nodos hay de altura h? • Para nodos de altura h el costo de Heapify es O(h). • Luego el costo es                         n h h n h h h n O O(h) n lg 0 lg 0 1 2 2 2 ) 2 / 1 1 ( 2 / 1 2 2 0       h h h ) ( 2 2 n O : por acotado ser puede Build_Heap 0 lgn 0 h n O h n O h h h h                       n/2h+1
  • 9. 9 Algoritmo Heapsort • 1.- Construir un heap invocando a Build_Heap • 2.- Intercambiar el primer elemento, la raíz y mayor elemento, del heap con el último. • 3.- Restituir la propiedad heap en el heap de n-1 elementos. Heapsort(A) Build_Heap(A) for (i= lenght(A) downto 2 ) do exchange A[1 <-> A[i heap_size [A = heap_size [A Heapify(A,1) • El costo de Heapsort es O(n lg n) porque el llamado a Build_Heap toma O(n) y luego tenemos n-1 llamados a Heapify cuyo tiempo es O(lgn).
  • 10. 10 Colas de Prioridad • Heapsort es muy bueno, pero es superado por quicksort (lo veremos luego). • La aplicación más popular de heapsort es para implementar colas de prioridad. • Una cola de prioridad es una estructura de datos que mantiene un conjunto de S de elementos cada uno asociado con una clave key. • La cola de prioridad soporta las siguientes operaciones: Insert(S,x): inserta x en el conjunto S Maximum(S): retorna el elemento con mayor clave. Extract-Max(S): remueve y retorna el elemento con mayor clave. • Aplicaciones: -Itineración de tareas en sistemas de tiempo compartido -Colas de prioridad en simuladores conducidos por evento (Event- driven simulator)
  • 11. 11 Operaciones en Colas de prioridad • Heap_Maximum(S): retorna el nodo raíz en tiempo (1). • Heap_Extract_Max(A) if heap_size[A] <1 then error “Heap undeflow” max = A[1] A[1] = A[heap_size [A]] heap_size [A] = heap_size [A]]-1 Heapify(A,1) return max • Heap_Insert(A,key) heap_size [A] = heap_size [A]+1 i = heap_size [A] while (i > 1 and A[Parent(i)] < key) do A[i] = A[Parent(i)] i = Parent(i) A[i] = key Tiempo de Heap_Extract_Max : O(lg n) básicamente el tiempo de Heapify Tiempo de Heap_Insert : O(lg n) porque es el recorrido desde la nueva hoja a la raíz.