SlideShare una empresa de Scribd logo
ARBOLES PARCIALMENTE ORDENADOS ESTRUCTURAS DE DATOS
CONCEPTOS Arbol Parcialmente Ordenado Es Binario Completo Con propiedad de orden Entre raiz e hijos, la raiz contiene el mayor(o menor) de todos Arbol Binario Completo Todos sus niveles estan completos A excepción del ultimo nivel,  Alli las hojas van apareciendo seguidas de izquierda a derecha 150 125 75 80 30 25 72 15 20 28
UTILIDAD DE UN HEAP Si el mayor valor esta siempre en la raiz El heap presenta un cierto orden Al remover consecutivamente la raiz Vamos consiguiendo valores  ordenados El heap se utiliza  Para el ordenamiento de elementos(HeapSort)‏ Para implementar colas de prioridad QDesencolarMax, es retirar el valor de la raiz
IMPLEMENTACION Un heap no admite “huecos”,  C/nivel se va llenando de izq. A der Hay una secuencia Podriamos numerar c/nodo En el orden de llenado 1 2 3 4 5 6 7 8 9 10 Si lo vemos asi, dado un índice Podemos conocer los indices de los hijos y el padre de un nodo Ejemplo: Del nodo 4, hijos 8 y 9, padre 2  i*2 i*2+1 i/2 150 125 75 80 30 25 72 15 20 28
CONTANDO DESDE 0 Queremos usar un vector En c/elemento almacenar la información Dirigirnos a hijos y padre calculando el índice respectivo Izq(i) = i*2 Der(i) = i*2+1 Padre(i) = i/2 Los vectores en C, empiezan desde 0 Cambia un poquito la regla Izq(i)  = (i+1)*2-1 =  i*2+1 Der(i)  = (i+1)*2 =  i*2+2 Padre(i)  = (i+1)/2-1 =  (i-1)/2 150 125 75 80 30 25 72 15 20 28 0 1 2 3 4 5 6 7 8 9 150 125 75 80 30 25 72 15 20 28 0 1 2 3 4 5 6 7 8 9
REGLAS Vector V de tamaño efectivo n V[0] es la raiz Dado un nodo V[i] Si 2i+1 < n, V[2i+1] es el hijo izq Si 2i+2 < n, V[2i+2] es el hijo der Si i != 0, v[(i-1)/2] es el padre Si es heap
DECLARACION: TDA HEAP Tipo de Dato Necesitamos un arreglo Llevar el tamaño efectivo Llevar el máximo del arreglo typedef struct{ Generico *Elementos; int nefectivo; int max; Tipo_Orden tipo; }Heap;
OPERACIONES BASICAS: TDA HEAP Desencolar y Encolar Desencolar: Extraer el elemento mas grande/pequeño del heap(la raiz)‏ Encolar: Insertar un valor al heap y ubicarlo en la posicion correcta HeapSort Dado un Heap permite generar un arreglo/lista ordenado Operaciones Adicionales Ajustar Reestablece la propiedad de orden de un subheap hacia abajo No a todo el arbol! Construir_heap Dado un arreglo que no representa un heap Arregla el arreglo y lo convierte en un Heap
MAS OPERACIONES int PosIzq(Heap H, int i); Retorna el indice del nodo izq de i Si no cumple las reglas, retorna -1 int PosDer(Heap H, int i); Retorna el índice del nodo der de i Si no cumple las reglas, retorna -1 int PosPadre(Heap H, int i); Retorna el índice del nodo padre de i Si no cumple las reglas, retorna -1  Heap * Heap_Crear(int tmax, TipoOrden t); Recibe un heap y lo inicializa para tener un tamaño maximo tmax y un orden t(ascendente o descendente)‏ bool EstaVacio(Heap P); Recibe un Heap y determina si esta Vacio
AJUSTAR Recobra la propiedad de orden  Desde un nodo de índice pos Dado un índice pos, PosIzq y PosDer Se compararan los tres para ver quien tiene el mayor Si el mayor lo tiene algun hijo Intercambia Al hacer esto, el sub-heap afectado puede perder su propiedad de Orden…. Ajustar el sub-heap afectado
AJUSTAR: EJEMPLO Un heap puede perder su p.o. Por un nodo Ejemplo: En el nodo 1 no se cumple Ajustar El mayor es el nodo 3 Intercambiar Ajustar desde nodo intercambiado(3)‏ Ejemplo: En el nodo 3 no se cumple Ajustar El mayor es el nodo 3 Intercambiar Ajustar Otra Vez Ejemplo: No se puede ajustar un nodo hoja 150 60 75 80 30 25 72 20 70 28 0 1 2 3 4 5 6 7 8 9 150 60 75 80 30 25 72 20 70 28 0 1 2 3 4 5 6 7 8 9 60 80 Pos PosMayor 80 60 Pos 70 PosMayor 70 60 150 80 75 70 30 25 72 20 60 28 0 1 2 3 4 5 6 7 8 9
AJUSTAR: IMPLEMENTACION static void Heap_Ajustar(Heap *H, int posnodo, Generico_fnComparar comocomparar){ int pos_mayor, izq, der; pos_mayor = posnodo; izq = IdxIzquierdo(*H, posnodo); der = IdxDerecho(*H, posnodo); if(izq>=0 && Heap_CompararxTipo(H->tipo_orden,H->Elementos[izq], H->Elementos[posnodo],comocomparar)  )‏ pos_mayor = izq; if(der>=0 && Heap_CompararxTipo(H->tipo_orden,H->Elementos[der],  H->Elementos[pos_mayor], comocomparar))‏ pos_mayor = der; if(pos_mayor != posnodo){ Generico_Intercambiar(&(H->Elementos[pos_mayor]),  &(H->Elementos[posnodo])); Heap_Ajustar(H,pos_mayor,comocomparar); } }
CONSTRUIR UN HEAP La estructura de un heap  Puede almacenar un arreglo que no cumpla las propiedades de orden Ejemplo: Hay que arreglar la propiedad de orden De cada raiz Ajustar c/raiz Desde la ultima a la primera 15 1 28 35 10 5 8 21 50 42 0 1 2 3 4 5 6 7 8 9 15 1 28 35 10 5 8 21 50 42 0 1 2 3 4 5 6 7 8 9
CONSTRUIR HEAP: EJEMPLO Ajustar el ultimo nodo raiz Los nodos raiz comienzan desde 0 hasta n/2-1 Al ajustar cada nodo De atrás hacia delante Nos aseguramos que los valores mas altos suban! 15 1 28 35 10 5 8 21 50 42 0 1 2 3 4 5 6 7 8 9 15 1 28 35 10 5 8 21 50 42 0 1 2 3 4 5 6 7 8 9 42 10 50 35 28 50 1 35 1 50 15 42 15 50 42 28 35 15 5 8 21 1 10 0 1 2 3 4 5 6 7 8 9
CONSTRUIR HEAP: IMPLEMENTACION void Construir_Heap(Heap *H, Generico_fncomparar comocomparar){ int i; for(i = H->n/2-1; i >= 0; i--){ Heap_Ajustar(H,i,comocomparar); } }
DESENCOLAR Que importancia tiene la raiz en el heap? Es el mayor/menor elemento del mismo Sobre el resto de elementos no estamos seguros Pero de la raiz, es la mayor de todos Desencolar es eliminar la raiz Que valor se ubica en la nueva raiz? El ultimo reemplaza al primero El tamaño efectivo del heap cambia Se ajusta desde la raiz El arbol queda bien otra vez
DESENCOLAR: EJEMPLO Intercambiar valores Raiz con ultimo Aminorar tamaño efectivo Ajustar arbol 150 125 75 80 30 25 72 15 20 28 0 1 2 3 4 5 6 7 8 9 150 125 75 80 30 25 72 15 20 28 0 1 2 3 4 5 6 7 8 9 28 28 125 75 80 30 25 72 15 20 0 1 2 3 4 5 6 7 8 125 28 28 80 125 80 75 28 30 25 72 15 20 0 1 2 3 4 5 6 7 8
DESENCOLAR: IMPLEMENTACION Generico Heap_DesEnColar(Heap *H,  Generico_fnComparar comocomparar){ Generico gmax; if(!Heap_EstaVacio(*H)){ gmax = H->Elementos[0]; Generico_Intercambiar(&(H->Elementos[0]),  &(H->Elementos[H->nefectiva-1])); H->nefectiva --; Heap_Ajustar(H, 0, comocomparar); return gmax; } return NULL; }
HEAPSORT Uno de los usos de los heaps es ordenar Como? Extraer el mayor elemento del heap(raiz)‏ Ponerla al final de otro arreglo Repetir los dos ultimos pasos hasta que el Heap quede Vacio El arreglo quedara ordenado
HEAPSORT: EJEMPLO Desencolar y ponerlo al final del nuevo arreglo/lista Repetir hasta que el arbol quede vacio 72 25 15 150 125 75 80 30 25 72 15 20 28 0 1 2 3 4 5 6 7 8 9 150 125 75 80 30 25 72 15 20 28 0 1 2 3 4 5 6 7 8 9 28 15 0 20 1 25 2 28 3 30 4 72 5 75 6 80 7 125 8 150 9 125 80 20 28 125 80 75 28 30 25 72 15 20 0 1 2 3 4 5 6 7 8 9 80 30 15 20 80 30 75 28 20 25 72 15 0 1 2 3 4 5 6 7 8 9 75 15 15 75 30 72 28 20 25 15 0 1 2 3 4 5 6 7 8 9 72 15 15 72 30 25 28 20 15 0 1 2 3 4 5 6 7 8 9 30 28 20 15 30 28 25 15 20 0 1 2 3 4 5 6 7 8 9 28 15 20 28 20 25 15 0 1 2 3 4 5 6 7 8 9 25 15 25 20 15 0 1 2 3 4 5 6 7 8 9 20 15 20 15 0 1 2 3 4 5 6 7 8 9 15 15 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9
HEAPSORT: IMPLEMENTACION LSE *HeapSort(LSE *Desordenada, Generico_fncomparar comocomparar){ Heap H; LSE_nodo *p; p = LSE_NodoPrimero(Desordenada);  while(!LSE_EstaVacia(Desordenada)) { Heap_Encolar(&H,LSE_SacarPrimerNodo(Desordenada),comocomparar) } while(Heap_EstaVacio(H)){ LSE_InsertarInicio(Desordenada, Heap_Desencolar(H, comocomparar); } return Desordenada; }
ENCOLAR Al añadir un nuevo elemento el Heap DEBE conservar su propiedad de orden Se añade al final del arreglo El elemento empieza a subir a su posición ideal Comparando siempre con el padre Hasta que el valor insertado sea menor que el del padre
ENCOLAR: EJEMPLO Insertar al final Subir el valor hasta que ya no sea necesario Nuevo valor:  130 150 125 75 80 30 25 72 15 20 28 0 1 2 3 4 5 6 7 8 9 150 125 75 80 30 25 72 15 20 28 0 1 2 3 4 5 6 7 8 9 130 10 130 130 30 130 125
ENCOLAR: IMPLEMENTACION void Heap_EnColar(Heap *H, Generico G,  Generico_fnComparar comocomparar){ int padre, i; if(H->nefectiva < H->max){ H->Elementos[H->nefectiva] = G; H->nefectiva++; i = H->nefectiva-1; padre = IdxPadre(*H,i); while((i>=0 && padre>=0) &&  Heap_CompararxTipo(H->tipo_orden, H->Elementos[i],  H->Elementos[padre], comocomparar)){ Generico_Intercambiar(&(H->Elementos[i]),  &(H->Elementos[padre])); i = padre; padre = IdxPadre(*H,i); } } }

Más contenido relacionado

PPTX
Trabajo de refuerzoo
PPTX
Mejoramiento yurani y yeiner
PDF
Clase 1 (funciones)
PPTX
ESTRUCTURAS Y ALGORITMOS II (I Bimestre Abril Agosto 2011)
PPT
Arreglos en C++
DOCX
Ejercicios en clase 23 09-13
Trabajo de refuerzoo
Mejoramiento yurani y yeiner
Clase 1 (funciones)
ESTRUCTURAS Y ALGORITMOS II (I Bimestre Abril Agosto 2011)
Arreglos en C++
Ejercicios en clase 23 09-13

Destacado (20)

PPT
Presentación fotos
PPSX
Pp presentation3d
DOCX
My first draft contents page
PPTX
The Locke Legacy : Chapter 1.1
PDF
Women's Jewelry Association - In The Know 2012 - Ben Smithee
PDF
PresentacióN 3 Determinantes Contextuales
PPS
Lilin harapan
PDF
2010 Honda Pilot Virginia Beach
PPS
I Miei Auguri Di Natale
PDF
Declaration for Piano
PDF
گزينش وارزيابي پايگاه اطلاعاتي
DOCX
Servicio americano
PPTX
Q magazine flat plan.
PDF
Team InGinia OAP Final Report
PPTX
O.A. Introducción a la Música
PDF
Unitat 03 superior
PPT
Serenata pp
PPS
Lilin harapan [sikumucha hery.blogspot.com]
PPTX
Possible Lair - Thomas Foster Memorial
DOCX
Caida libre
Presentación fotos
Pp presentation3d
My first draft contents page
The Locke Legacy : Chapter 1.1
Women's Jewelry Association - In The Know 2012 - Ben Smithee
PresentacióN 3 Determinantes Contextuales
Lilin harapan
2010 Honda Pilot Virginia Beach
I Miei Auguri Di Natale
Declaration for Piano
گزينش وارزيابي پايگاه اطلاعاتي
Servicio americano
Q magazine flat plan.
Team InGinia OAP Final Report
O.A. Introducción a la Música
Unitat 03 superior
Serenata pp
Lilin harapan [sikumucha hery.blogspot.com]
Possible Lair - Thomas Foster Memorial
Caida libre
Publicidad

Similar a 13 heaps (20)

PDF
Pqueues
PDF
Pqueues
PPT
Explica que son las pilas en estructura de datos
PPT
Listas Pilas Colas
PPTX
Heap sort
PPTX
Estructura de datos I Primera Parte
PPT
LISTAS ESPECIALES
PPTX
Proyecto estructura
PDF
Curso-PROPE-PyED-5-Pilas-Colas-programacion
PPT
ED 03 2_listas especiales
 
PPT
PresentacióN 4
PPT
Intro a ruby
PPT
Heap sort2
PPT
Heap sort
PPTX
Algoritmo de almacenamiento - Método Heap Sort
DOCX
Qué son las colas de prioridad
PPT
Metodos De Ordenamiento
PPTX
Pqueues
Pqueues
Explica que son las pilas en estructura de datos
Listas Pilas Colas
Heap sort
Estructura de datos I Primera Parte
LISTAS ESPECIALES
Proyecto estructura
Curso-PROPE-PyED-5-Pilas-Colas-programacion
ED 03 2_listas especiales
 
PresentacióN 4
Intro a ruby
Heap sort2
Heap sort
Algoritmo de almacenamiento - Método Heap Sort
Qué son las colas de prioridad
Metodos De Ordenamiento
Publicidad

13 heaps

  • 1. ARBOLES PARCIALMENTE ORDENADOS ESTRUCTURAS DE DATOS
  • 2. CONCEPTOS Arbol Parcialmente Ordenado Es Binario Completo Con propiedad de orden Entre raiz e hijos, la raiz contiene el mayor(o menor) de todos Arbol Binario Completo Todos sus niveles estan completos A excepción del ultimo nivel, Alli las hojas van apareciendo seguidas de izquierda a derecha 150 125 75 80 30 25 72 15 20 28
  • 3. UTILIDAD DE UN HEAP Si el mayor valor esta siempre en la raiz El heap presenta un cierto orden Al remover consecutivamente la raiz Vamos consiguiendo valores ordenados El heap se utiliza Para el ordenamiento de elementos(HeapSort)‏ Para implementar colas de prioridad QDesencolarMax, es retirar el valor de la raiz
  • 4. IMPLEMENTACION Un heap no admite “huecos”, C/nivel se va llenando de izq. A der Hay una secuencia Podriamos numerar c/nodo En el orden de llenado 1 2 3 4 5 6 7 8 9 10 Si lo vemos asi, dado un índice Podemos conocer los indices de los hijos y el padre de un nodo Ejemplo: Del nodo 4, hijos 8 y 9, padre 2 i*2 i*2+1 i/2 150 125 75 80 30 25 72 15 20 28
  • 5. CONTANDO DESDE 0 Queremos usar un vector En c/elemento almacenar la información Dirigirnos a hijos y padre calculando el índice respectivo Izq(i) = i*2 Der(i) = i*2+1 Padre(i) = i/2 Los vectores en C, empiezan desde 0 Cambia un poquito la regla Izq(i) = (i+1)*2-1 = i*2+1 Der(i) = (i+1)*2 = i*2+2 Padre(i) = (i+1)/2-1 = (i-1)/2 150 125 75 80 30 25 72 15 20 28 0 1 2 3 4 5 6 7 8 9 150 125 75 80 30 25 72 15 20 28 0 1 2 3 4 5 6 7 8 9
  • 6. REGLAS Vector V de tamaño efectivo n V[0] es la raiz Dado un nodo V[i] Si 2i+1 < n, V[2i+1] es el hijo izq Si 2i+2 < n, V[2i+2] es el hijo der Si i != 0, v[(i-1)/2] es el padre Si es heap
  • 7. DECLARACION: TDA HEAP Tipo de Dato Necesitamos un arreglo Llevar el tamaño efectivo Llevar el máximo del arreglo typedef struct{ Generico *Elementos; int nefectivo; int max; Tipo_Orden tipo; }Heap;
  • 8. OPERACIONES BASICAS: TDA HEAP Desencolar y Encolar Desencolar: Extraer el elemento mas grande/pequeño del heap(la raiz)‏ Encolar: Insertar un valor al heap y ubicarlo en la posicion correcta HeapSort Dado un Heap permite generar un arreglo/lista ordenado Operaciones Adicionales Ajustar Reestablece la propiedad de orden de un subheap hacia abajo No a todo el arbol! Construir_heap Dado un arreglo que no representa un heap Arregla el arreglo y lo convierte en un Heap
  • 9. MAS OPERACIONES int PosIzq(Heap H, int i); Retorna el indice del nodo izq de i Si no cumple las reglas, retorna -1 int PosDer(Heap H, int i); Retorna el índice del nodo der de i Si no cumple las reglas, retorna -1 int PosPadre(Heap H, int i); Retorna el índice del nodo padre de i Si no cumple las reglas, retorna -1 Heap * Heap_Crear(int tmax, TipoOrden t); Recibe un heap y lo inicializa para tener un tamaño maximo tmax y un orden t(ascendente o descendente)‏ bool EstaVacio(Heap P); Recibe un Heap y determina si esta Vacio
  • 10. AJUSTAR Recobra la propiedad de orden Desde un nodo de índice pos Dado un índice pos, PosIzq y PosDer Se compararan los tres para ver quien tiene el mayor Si el mayor lo tiene algun hijo Intercambia Al hacer esto, el sub-heap afectado puede perder su propiedad de Orden…. Ajustar el sub-heap afectado
  • 11. AJUSTAR: EJEMPLO Un heap puede perder su p.o. Por un nodo Ejemplo: En el nodo 1 no se cumple Ajustar El mayor es el nodo 3 Intercambiar Ajustar desde nodo intercambiado(3)‏ Ejemplo: En el nodo 3 no se cumple Ajustar El mayor es el nodo 3 Intercambiar Ajustar Otra Vez Ejemplo: No se puede ajustar un nodo hoja 150 60 75 80 30 25 72 20 70 28 0 1 2 3 4 5 6 7 8 9 150 60 75 80 30 25 72 20 70 28 0 1 2 3 4 5 6 7 8 9 60 80 Pos PosMayor 80 60 Pos 70 PosMayor 70 60 150 80 75 70 30 25 72 20 60 28 0 1 2 3 4 5 6 7 8 9
  • 12. AJUSTAR: IMPLEMENTACION static void Heap_Ajustar(Heap *H, int posnodo, Generico_fnComparar comocomparar){ int pos_mayor, izq, der; pos_mayor = posnodo; izq = IdxIzquierdo(*H, posnodo); der = IdxDerecho(*H, posnodo); if(izq>=0 && Heap_CompararxTipo(H->tipo_orden,H->Elementos[izq], H->Elementos[posnodo],comocomparar) )‏ pos_mayor = izq; if(der>=0 && Heap_CompararxTipo(H->tipo_orden,H->Elementos[der], H->Elementos[pos_mayor], comocomparar))‏ pos_mayor = der; if(pos_mayor != posnodo){ Generico_Intercambiar(&(H->Elementos[pos_mayor]), &(H->Elementos[posnodo])); Heap_Ajustar(H,pos_mayor,comocomparar); } }
  • 13. CONSTRUIR UN HEAP La estructura de un heap Puede almacenar un arreglo que no cumpla las propiedades de orden Ejemplo: Hay que arreglar la propiedad de orden De cada raiz Ajustar c/raiz Desde la ultima a la primera 15 1 28 35 10 5 8 21 50 42 0 1 2 3 4 5 6 7 8 9 15 1 28 35 10 5 8 21 50 42 0 1 2 3 4 5 6 7 8 9
  • 14. CONSTRUIR HEAP: EJEMPLO Ajustar el ultimo nodo raiz Los nodos raiz comienzan desde 0 hasta n/2-1 Al ajustar cada nodo De atrás hacia delante Nos aseguramos que los valores mas altos suban! 15 1 28 35 10 5 8 21 50 42 0 1 2 3 4 5 6 7 8 9 15 1 28 35 10 5 8 21 50 42 0 1 2 3 4 5 6 7 8 9 42 10 50 35 28 50 1 35 1 50 15 42 15 50 42 28 35 15 5 8 21 1 10 0 1 2 3 4 5 6 7 8 9
  • 15. CONSTRUIR HEAP: IMPLEMENTACION void Construir_Heap(Heap *H, Generico_fncomparar comocomparar){ int i; for(i = H->n/2-1; i >= 0; i--){ Heap_Ajustar(H,i,comocomparar); } }
  • 16. DESENCOLAR Que importancia tiene la raiz en el heap? Es el mayor/menor elemento del mismo Sobre el resto de elementos no estamos seguros Pero de la raiz, es la mayor de todos Desencolar es eliminar la raiz Que valor se ubica en la nueva raiz? El ultimo reemplaza al primero El tamaño efectivo del heap cambia Se ajusta desde la raiz El arbol queda bien otra vez
  • 17. DESENCOLAR: EJEMPLO Intercambiar valores Raiz con ultimo Aminorar tamaño efectivo Ajustar arbol 150 125 75 80 30 25 72 15 20 28 0 1 2 3 4 5 6 7 8 9 150 125 75 80 30 25 72 15 20 28 0 1 2 3 4 5 6 7 8 9 28 28 125 75 80 30 25 72 15 20 0 1 2 3 4 5 6 7 8 125 28 28 80 125 80 75 28 30 25 72 15 20 0 1 2 3 4 5 6 7 8
  • 18. DESENCOLAR: IMPLEMENTACION Generico Heap_DesEnColar(Heap *H, Generico_fnComparar comocomparar){ Generico gmax; if(!Heap_EstaVacio(*H)){ gmax = H->Elementos[0]; Generico_Intercambiar(&(H->Elementos[0]), &(H->Elementos[H->nefectiva-1])); H->nefectiva --; Heap_Ajustar(H, 0, comocomparar); return gmax; } return NULL; }
  • 19. HEAPSORT Uno de los usos de los heaps es ordenar Como? Extraer el mayor elemento del heap(raiz)‏ Ponerla al final de otro arreglo Repetir los dos ultimos pasos hasta que el Heap quede Vacio El arreglo quedara ordenado
  • 20. HEAPSORT: EJEMPLO Desencolar y ponerlo al final del nuevo arreglo/lista Repetir hasta que el arbol quede vacio 72 25 15 150 125 75 80 30 25 72 15 20 28 0 1 2 3 4 5 6 7 8 9 150 125 75 80 30 25 72 15 20 28 0 1 2 3 4 5 6 7 8 9 28 15 0 20 1 25 2 28 3 30 4 72 5 75 6 80 7 125 8 150 9 125 80 20 28 125 80 75 28 30 25 72 15 20 0 1 2 3 4 5 6 7 8 9 80 30 15 20 80 30 75 28 20 25 72 15 0 1 2 3 4 5 6 7 8 9 75 15 15 75 30 72 28 20 25 15 0 1 2 3 4 5 6 7 8 9 72 15 15 72 30 25 28 20 15 0 1 2 3 4 5 6 7 8 9 30 28 20 15 30 28 25 15 20 0 1 2 3 4 5 6 7 8 9 28 15 20 28 20 25 15 0 1 2 3 4 5 6 7 8 9 25 15 25 20 15 0 1 2 3 4 5 6 7 8 9 20 15 20 15 0 1 2 3 4 5 6 7 8 9 15 15 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9
  • 21. HEAPSORT: IMPLEMENTACION LSE *HeapSort(LSE *Desordenada, Generico_fncomparar comocomparar){ Heap H; LSE_nodo *p; p = LSE_NodoPrimero(Desordenada); while(!LSE_EstaVacia(Desordenada)) { Heap_Encolar(&H,LSE_SacarPrimerNodo(Desordenada),comocomparar) } while(Heap_EstaVacio(H)){ LSE_InsertarInicio(Desordenada, Heap_Desencolar(H, comocomparar); } return Desordenada; }
  • 22. ENCOLAR Al añadir un nuevo elemento el Heap DEBE conservar su propiedad de orden Se añade al final del arreglo El elemento empieza a subir a su posición ideal Comparando siempre con el padre Hasta que el valor insertado sea menor que el del padre
  • 23. ENCOLAR: EJEMPLO Insertar al final Subir el valor hasta que ya no sea necesario Nuevo valor: 130 150 125 75 80 30 25 72 15 20 28 0 1 2 3 4 5 6 7 8 9 150 125 75 80 30 25 72 15 20 28 0 1 2 3 4 5 6 7 8 9 130 10 130 130 30 130 125
  • 24. ENCOLAR: IMPLEMENTACION void Heap_EnColar(Heap *H, Generico G, Generico_fnComparar comocomparar){ int padre, i; if(H->nefectiva < H->max){ H->Elementos[H->nefectiva] = G; H->nefectiva++; i = H->nefectiva-1; padre = IdxPadre(*H,i); while((i>=0 && padre>=0) && Heap_CompararxTipo(H->tipo_orden, H->Elementos[i], H->Elementos[padre], comocomparar)){ Generico_Intercambiar(&(H->Elementos[i]), &(H->Elementos[padre])); i = padre; padre = IdxPadre(*H,i); } } }