Saltar al contenido principal

Heap Sort

Heap Sort es un algoritmo de ordenamiento basado en la estructura de datos heap binario (montículo). Utiliza un Max-Heap (o Min-Heap, según el orden requerido) para organizar los datos y ordenarlos de manera eficiente.

¿Que es un Heap?

En español, heap traduce cómo montón, pila o cúmulo. Un heap binario es un árbol binario completo que satisface la propiedad de heap:

  • En un Max-Heap, cada nodo es mayor o igual que sus hijos.
  • En un Min-Heap, cada nodo es menor o igual que sus hijos.

Funcionamiento general de Heap Sort

  1. Construir un Max-Heap a partir del arreglo.
  2. Repetir hasta que el heap esté vacío:
    • Intercambiar el primer elemento (máximo) con el último.
    • Reducir el tamaño del heap en 1.
    • Aplicar heapify para restaurar la propiedad del Max-Heap.

Complejidades

  • En el mejor caso, la complejidad temporal es de O(nlogn)O(n log n), y la complejidad espacial es de O(1)O(1)
  • En el caso promedio, la complejidad temporal es de O(nlogn)O(n log n), y la complejidad espacial es de O(1)O(1)
  • En el peor caso, la complejidad temporal es de O(nlogn)O(n log n), y la complejidad espacial es de O(1)O(1)

Propiedades

  1. Es In-place
  2. No es estable
  3. Es no adaptativo
  4. Es útil cuando se requiere bajo uso de memoria adicional y rendimiento constante.

Diagrama de secuencia

  1. El usuario solicit ordenar el arreglo usando el algoritmo Heap Sort.
  2. El algoritmo obtiene la longitud del arreglo y lo guarda en la variable n.
  3. Se construye el Max-Heap para ordenar de forma ascendente, partiendo desde la mitad hacia el inicio, usando como referencia la longitud del arreglo y la iteración actual en el bucle. En este caso la variable i se inicializa desde la posición anterior a la mitad del arreglo.
  4. Se compara el nodo principal del Heap con respecto a los nodos hijos.
  5. Si el nodo padre es mayor al hijo, se hace el intercambio para lograr que el mayor quede en la raíz.
  6. Se retorna el Max-Heap parcialmente actualizado, preparando el arreglo para que los máximos queden en la raíz.
  7. En un segundo bucle se extraen los máximos, y se intercambia el elemento en la primera posición (corresponde al máximo), con el elemento de la posición j, que corresponde al último no ordenado.
  8. Se aplica el heapify hasta que todo el arreglo esté ordenado. Es cómo ir sacando el máximo y colocándolo al final, uno a uno.
  9. Finalmente se retorna el arreglo ordenado.

Ejemplo técnico

public class HeapSort {
public static void sort(int[] array) {
int length = array.length;

for (int currentIndex = length / 2 - 1; currentIndex >= 0; currentIndex--) {
heapify(array, length, currentIndex);
}

for (int lastIndex = length - 1; lastIndex > 0; lastIndex--) {
swap(array, 0, lastIndex);
heapify(array, lastIndex, 0);
}
}

private static void heapify(int[] array, int heapSize, int rootIndex) {
int largestIndex = rootIndex;
int leftChildIndex = 2 * rootIndex + 1;
int rightChildIndex = 2 * rootIndex + 2;

if (leftChildIndex < heapSize && array[leftChildIndex] > array[largestIndex]) {
largestIndex = leftChildIndex;
}

if (rightChildIndex < heapSize && array[rightChildIndex] > array[largestIndex]) {
largestIndex = rightChildIndex;
}

if (largestIndex != rootIndex) {
swap(array, rootIndex, largestIndex);
heapify(array, heapSize, largestIndex);
}
}

private static void swap(int[] array, int indexA, int indexB) {
int temp = array[indexA];
array[indexA] = array[indexB];
array[indexB] = temp;
}
}

Aplicaciones reales

  • Sistemas con restricciones de memoria (por su comportamiento O(1)O(1) en espacio).
  • Ordenamiento de archivos muy grandes donde no se puede usar memoria extra.
  • Algoritmo base en colas de prioridad (como PriorityQueue).
  • Sistemas en tiempo real donde el peor caso O(nlogn)O(n log n) es garantizado.

Referencias

  • Cormen, T. H., Leiserson, C. E., Rivest, R. L., & Stein, C. (2022). Introduction to Algorithms (4th ed.). MIT Press.
  • Sedgewick, R., & Wayne, K. (2011). Algorithms (4th ed.). Addison-Wesley.
  • Knuth, D. E. (1998). The Art of Computer Programming, Vol. 3: Sorting and Searching. Addison-Wesley.
  • Weiss, M. A. (2020). Data Structures and Algorithm Analysis in Java (4th ed.). Pearson.