Menu
Coddy logo textTech

Heap Sort

Última actualización

Heap sort trata el arreglo como un heap binario. Primero construye un max-heap, de modo que el elemento más grande queda en la raíz (índice 0). Luego intercambia repetidamente la raíz con el último elemento no ordenado - fijando el máximo en su lugar - y hunde la nueva raíz para restaurar la propiedad del heap. Pulsa reproducir arriba para ver cómo se construye el heap y las extracciones.

Heap sort garantiza un tiempo de O(n log n) como merge sort, pero ordena en el sitio con solo O(1) de espacio adicional. No es estable y suele tener peor comportamiento de caché que quicksort, por lo que se elige a menudo cuando importan tanto una cota garantizada como una memoria constante.

Complejidad temporal y espacial

CasoComplejidadNotas
Mejor casoO(n log n)Construcción + n extracciones
Caso promedioO(n log n)Orden aleatorio
Peor casoO(n log n)Garantizado
EspacioO(1)En el sitio
EstableNoEl hundimiento reordena elementos iguales

Paso a paso

PasoQué ocurre
1Construir un max-heap a partir del arreglo (hundir desde el último padre).
2Intercambiar la raíz (máximo) con el último elemento del heap.
3Reducir el heap en uno - ese último hueco ya está ordenado.
4Hundir la nueva raíz para restaurar la propiedad del max-heap.
5Repetir hasta que el heap tenga un solo elemento.

Ejemplo resuelto

Ordenando [3, 1, 6, 5, 2, 4]. La barra | marca el límite entre el heap que se reduce y la cola ordenada:

PasadaArregloAcción
Construir heap[6, 5, 4, 1, 2, 3]Hundir desde el último padre para construir el max-heap; 6 queda ahora en la raíz.
1[5, 3, 4, 1, 2 | 6]Intercambiar la raíz 6 con el último hueco, reducir el heap y hundir 3.
2[4, 3, 2, 1 | 5, 6]Sacar la raíz 5, luego hundir 2 para que 4 suba a la raíz.
3[3, 1, 2 | 4, 5, 6]Sacar la raíz 4, luego hundir 1 para que 3 suba a la raíz.
4[2, 1 | 3, 4, 5, 6]Sacar la raíz 3; 2 ya cumple la propiedad del heap.
5[1 | 2, 3, 4, 5, 6]Sacar la raíz 2; queda un elemento, así que el arreglo está ordenado.

Cuándo usar heap sort

Úsalo cuandoEvítalo cuando
Necesitas un peor caso garantizado de O(n log n) sin riesgo de O(n²).Necesitas un ordenamiento estable que preserve el orden de claves iguales.
La memoria es escasa - ordena en el sitio con solo O(1) de espacio adicional.Importa el rendimiento de caché y los datos caben en memoria - quicksort suele ser más rápido.
Ya mantienes un heap (p. ej. una cola de prioridad) sobre los datos.Quieres el menor número de comparaciones - merge sort y quicksort suelen hacer menos en la práctica.
Una entrada no confiable podría provocar el peor caso de quicksort y no puedes aleatorizar.Los datos están casi ordenados - insertion sort se ejecuta en tiempo casi lineal sobre ellos.

Código de Heap Sort

Una implementación limpia y ejecutable de Heap Sort en Python, JavaScript, Java, C++, C. Elige un lenguaje, copia el código o ábrelo ya cargado en el Playground de Coddy.

Código de Heap Sort en Python

Python
1def heap_sort(a):2    n = len(a)3    # Build a max-heap, deepest parent first4    for i in range(n // 2 - 1, -1, -1):5        sift_down(a, i, n)6    # Repeatedly move the max to the end and shrink the heap7    for end in range(n - 1, 0, -1):8        a[0], a[end] = a[end], a[0]9        sift_down(a, 0, end)10    return a11
12
13def sift_down(a, i, size):14    while True:15        largest = i16        left, right = 2 * i + 1, 2 * i + 217        if left < size and a[left] > a[largest]:18            largest = left19        if right < size and a[right] > a[largest]:20            largest = right21        if largest == i:22            return23        a[i], a[largest] = a[largest], a[i]24        i = largest25
26
27nums = [12, 11, 13, 5, 6, 7]28print("Before:", nums)29heap_sort(nums)30print("After: ", nums)
Ejecuta este código en el Playground de Python

Preguntas frecuentes sobre Heap Sort

¿Cuál es la complejidad temporal de heap sort?
Heap sort es O(n log n) en el mejor, el promedio y el peor caso. Construir el heap es O(n) y cada una de las n extracciones cuesta O(log n). Usa O(1) de espacio adicional.
¿Es estable heap sort?
No. La operación de hundimiento puede mover elementos iguales unos sobre otros, por lo que heap sort no preserva el orden relativo de las claves iguales.
¿Cuándo debería usar heap sort?
Usa heap sort cuando necesites un peor caso garantizado de O(n log n) con solo O(1) de memoria adicional. Evita el riesgo de O(n²) de quicksort sin el búfer de O(n) de merge sort, a costa de la estabilidad y el rendimiento de caché.
¿Cuál es la diferencia entre heap sort y quicksort?
Ambos ordenan en el sitio, pero quicksort tiene un peor caso de O(n²) mientras que heap sort garantiza O(n log n). En la práctica quicksort suele ser más rápido por su mejor localidad de caché y menos intercambios, así que heap sort se prefiere sobre todo cuando la cota del peor caso debe estar garantizada.
¿Cómo se relaciona heap sort con una cola de prioridad?
Un heap binario es la implementación estándar de una cola de prioridad, y heap sort consiste esencialmente en extraer repetidamente el máximo de esa cola. Si ya mantienes tus datos en un heap, extraer los elementos uno a uno te da el orden ordenado gratis.
¿Heap sort necesita un max-heap o un min-heap?
Para ordenar de forma ascendente en el sitio, usa un max-heap: el elemento más grande se intercambia al final en cada pasada, haciendo crecer la cola ordenada desde la derecha. Un min-heap produciría orden descendente en el sitio, u orden ascendente si extraes hacia un arreglo separado.
Coddy programming languages illustration

Domina los algoritmos con Coddy

COMENZAR