SincroDev Logo SincroDev

Heap Sort: Ordenando con Árboles Binarios


Si Bubble Sort es fuerza bruta, Heap Sort es arquitectura inteligente. Este algoritmo no solo ordena; primero organiza los datos en una estructura muy específica llamada Heap (Montículo) para facilitar el trabajo.

El concepto: Max-Heap

Un Heap es una forma de visualizar un array como si fuera un árbol binario. En un Max-Heap, el “padre” siempre es mayor que sus “hijos”. Esto garantiza una propiedad vital: el elemento más grande de todo el conjunto siempre está en la raíz (el inicio del array).

🏁 Carrera de Algoritmos

Mismo set de datos (50 elementos). ¿Quién gana?

Bubble Sort 0.00s
🏆
Heap Sort 0.00s
🏆
Quick Sort 0.00s
🏆

El Algoritmo

  1. Construir el Heap: Convertimos nuestra lista desordenada en un Max-Heap. Ahora sabemos que el primer elemento es el máximo.
  2. Extracción:
    • Tomamos el primer elemento (el mayor) y lo intercambiamos con el último del array.
    • Consideramos ese último elemento como “ya ordenado” y lo ignoramos.
    • “Reparamos” el Heap (Heapify) para que el nuevo primer elemento sea el siguiente mayor.
    • Repetimos hasta que no queden elementos.

El Código (Python)

def heapify(arr, n, i):
    largest = i   # Inicializar el más grande como raíz
    l = 2 * i + 1 # izquierda
    r = 2 * i + 2 # derecha

    # Ver si el hijo izquierdo existe y es mayor que la raíz
    if l < n and arr[l] > arr[largest]:
        largest = l

    # Ver si el hijo derecho existe y es mayor que la raíz
    if r < n and arr[r] > arr[largest]:
        largest = r

    # Cambiar la raíz si es necesario
    if largest != i:
        arr[i], arr[largest] = arr[largest], arr[i] # Swap
        heapify(arr, n, largest)

def heap_sort(arr):
    n = len(arr)

    # Construir un maxheap.
    for i in range(n // 2 - 1, -1, -1):
        heapify(arr, n, i)

    # Extraer elementos uno a uno
    for i in range(n - 1, 0, -1):
        arr[i], arr[0] = arr[0], arr[i] # Swap
        heapify(arr, i, 0)

Rendimiento: O(n log n)

A diferencia de Bubble Sort, Heap Sort es muy eficiente. Su complejidad es O(n log n) tanto en el mejor como en el peor de los casos.

Ventajas y Desventajas

  • Pro: No usa memoria extra (es in-place), a diferencia de Merge Sort.
  • Pro: Muy consistente. No hay “casos malos” que lo hagan lento.
  • Contra: No es “estable” (puede cambiar el orden relativo de elementos iguales).
  • Contra: En la práctica, suele ser un poco más lento que Quick Sort debido a cómo accede a la memoria (saltando índices).

Ver otros algoritmos