Saltar al contenido principal
Una cola normal atiende por orden de llegada. Una cola de prioridad atiende siempre al elemento más importante: el paciente más grave en urgencias, el proceso con más prioridad en un sistema operativo o el nodo más cercano en el algoritmo de Dijkstra. La forma más eficiente de implementarla es el montículo binario (heap): un árbol que se guarda en un simple array y permite insertar y sacar el máximo en O(log⁡n)O(\log n).

Lo que vas a aprender

  • Qué es un montículo y la propiedad de montículo.
  • Cómo se guarda un árbol binario completo en un array.
  • La inserción (flotar) y la extracción (hundir).
  • Cómo construir un montículo en tiempo lineal.
  • El algoritmo de ordenación heapsort.
  • Las colas de prioridad y dónde se usan.

Fundamentos teóricos

Definición

Un montículo binario es un árbol binario:
  1. Completo: todos los niveles llenos salvo quizá el último, que se llena de izquierda a derecha.
  2. Con la propiedad de montículo: en un montículo de máximos, cada nodo es mayor o igual que sus hijos (en uno de mínimos, menor o igual).
Por tanto, la raíz es el máximo (o el mínimo). No está ordenado como un árbol de búsqueda: entre hermanos no hay orden.

Representación en un array

Al ser completo, se guarda por niveles en un array sin punteros. Con índices desde 0: Su altura es ⌊log⁡2n⌋\lfloor\log_2 n\rfloor.

Insertar: flotar

Se pone el elemento al final del array y se va intercambiando con su padre mientras sea mayor que él. Coste O(log⁡n)O(\log n).

Extraer el máximo: hundir

Se saca la raíz, se pone en su lugar el último elemento y se va intercambiando con el mayor de sus hijos mientras sea menor. Coste O(log⁡n)O(\log n).

Construir un montículo: heapify

Para convertir un array cualquiera en un montículo, se hunde cada nodo desde el último padre hasta la raíz:
Parece O(nlog⁡n)O(n\log n), pero es O(n)O(n): la mayoría de los nodos están abajo y se hunden muy poco.

Heapsort

  1. Construye un montículo de máximos: O(n)O(n).
  2. Intercambia la raíz (el máximo) con el último elemento, reduce el tamaño en 1 y hunde la nueva raíz. Repite: O(nlog⁡n)O(n\log n).
Ordena en el mismo array (sin memoria extra) y en O(nlog⁡n)O(n\log n) siempre, también en el peor caso. A cambio, no es estable y en la práctica suele ser algo más lento que quicksort. Puedes compararlo con otros en el simulador de algoritmos de ordenación.

Colas de prioridad

En Python, heapq implementa un montículo de mínimos sobre una lista; en Java, PriorityQueue; en C++, std::priority_queue (de máximos). Usos: Dijkstra y Prim, planificación de procesos en sistemas operativos, simulación de eventos, el algoritmo de Huffman de compresión, y obtener los kk mayores de un conjunto enorme sin ordenarlo entero.

Ejemplos resueltos

Ejemplo 1 · Insertar en un montículo de máximos

Montículo [50, 30, 40, 10, 20]. Se inserta 45: queda en el índice 5, cuyo padre es el índice 2 (40).45 > 40: se intercambian → [50, 30, 45, 10, 20, 40]. Padre del índice 2: el 0 (50). 45 < 50: se para.
De [50, 30, 45, 10, 20, 40] se saca el 50 y el 40 pasa a la raíz: [40, 30, 45, 10, 20].Hijos de la raíz: 30 y 45. El mayor, 45, es mayor que 40: se intercambian → [45, 30, 40, 10, 20]. El 40 ya no tiene hijos: fin.
Array [3, 9, 2, 1, 4, 5]. Último padre: índice 2.
  • Índice 2 (2): hijo 5 → [3, 9, 5, 1, 4, 2].
  • Índice 1 (9): hijos 1 y 4, es mayor: no cambia.
  • Índice 0 (3): hijos 9 y 5 → intercambia con 9: [9, 3, 5, 1, 4, 2]; el 3 tiene hijos 1 y 4 → con 4: [9, 4, 5, 1, 3, 2].
Resultado: [9, 4, 5, 1, 3, 2].
Con un montículo de mínimos de tamaño 3: se recorre el millón de datos y, si un dato es mayor que la raíz (el menor de los 3 guardados), se sustituye. Coste O(nlog⁡k)O(n\log k) en lugar de O(nlog⁡n)O(n\log n) de ordenar todo.

Errores frecuentes

  • Pensar que un montículo está ordenado. Solo está garantizado que la raíz es el máximo (o mínimo).
  • Hundir intercambiando con cualquier hijo. Hay que elegir el mayor (o el menor, en uno de mínimos).
  • Equivocar los índices según se empiece en 0 o en 1: con base 1, los hijos son 2i2i y 2i+12i + 1.
  • Usar heapq como montículo de máximos. Es de mínimos; para máximos, se guardan los valores cambiados de signo.
  • Construir insertando uno a uno (O(nlog⁡n)O(n\log n)) cuando ya se tiene el array: heapify es O(n)O(n).

Preguntas frecuentes

Nada, salvo el nombre. El heap de memoria (donde se reserva con malloc o new) es una zona de memoria dinámica; el montículo es una estructura de datos. Lo primero se explica en memoria y punteros en C.
Los montículos de Fibonacci bajan el coste de “disminuir clave” a O(1)O(1) amortizado, lo que mejora Dijkstra en teoría a O(E+Vlog⁡V)O(E + V\log V). En la práctica, por sus constantes, el montículo binario suele ganar.

Temas relacionados

Algoritmos de ordenación

Heapsort frente a los demás.

Dijkstra y caminos mínimos

El uso más famoso de una cola de prioridad.

Árboles AVL

Árboles de búsqueda equilibrados.
Última modificación el 12 de octubre de 2026