Heap Sort — Algoritma

Heap Sort menggunakan struktur Heap (yang sudah kamu pelajari di Struktur Data) untuk mengurutkan data. Kompleksitas: O(n log n) — selalu, tidak ada worst…

Heap sort mengurutkan array dengan terus mengambil angka terbesar dan menaruhnya di ujung belakang. Supaya angka terbesar selalu gampang ditemukan, array-nya disusun dulu jadi heap. Mirip antrean IGD: pasien paling gawat selalu dipanggil duluan, dan setelah dia ditangani, yang paling gawat berikutnya naik ke depan.

🧪 Tebakan cepat: kalau array sudah jadi max-heap, apakah array itu sudah terurut? Tebak dulu, jawabannya ada di bagian "Heap, lalu ambil yang terbesar".

Heap, lalu ambil yang terbesar

Max-heap adalah array yang dibaca sebagai pohon: angka di index i punya dua anak, di index 2i + 1 dan 2i + 2. Aturannya cuma satu: tiap parent (induk) lebih besar atau sama dengan anak-anaknya, jadi angka terbesar selalu ada di index 0, yang disebut root.

array: [13, 11, 12, 5, 6, 7]

        13           index 0 (root)
      /    \
    11      12       index 1 dan 2
   /  \    /
  5    6  7          index 3, 4, 5

Array ini max-heap (13 di atas 11 dan 12, 11 di atas 5 dan 6, 12 di atas 7), tapi belum terurut: 11 masih di depan 12. Itu jawaban tebakannya: heap cuma menjamin root-nya yang terbesar.

Heap sort jalan dalam dua fase. Ini yang terjadi pada [12, 11, 13, 5, 6, 7]:

Langkah Heap Sudah di tempatnya
Awal [12, 11, 13, 5, 6, 7]
Fase 1: bangun max-heap [13, 11, 12, 5, 6, 7]
Tukar 13 ke ujung, perbaiki heap [12, 11, 7, 5, 6] [13]
Tukar 12 ke ujung, perbaiki heap [11, 6, 7, 5] [12, 13]
Tukar 11 ke ujung, perbaiki heap [7, 6, 5] [11, 12, 13]
Ulangi sampai heap habis [5, 6, 7, 11, 12, 13]
function heapSort(arr) {
  const n = arr.length;
  // fase 1: bangun max-heap, mulai dari parent terakhir
  for (let i = Math.floor(n / 2) - 1; i >= 0; i--) heapify(arr, n, i);

  // fase 2: tukar root (terbesar) ke ujung, heap menyusut satu
  for (let i = n - 1; i > 0; i--) {
    [arr[0], arr[i]] = [arr[i], arr[0]];
    heapify(arr, i, 0);
  }
  return arr;
}

function heapify(arr, size, root) {
  let largest = root;
  const left = 2 * root + 1;
  const right = 2 * root + 2;
  if (left < size && arr[left] > arr[largest]) largest = left;
  if (right < size && arr[right] > arr[largest]) largest = right;
  if (largest !== root) {
    [arr[root], arr[largest]] = [arr[largest], arr[root]];
    heapify(arr, size, largest); // terus turun sampai aman
  }
}

console.log(heapSort([12, 11, 13, 5, 6, 7]));
// [5, 6, 7, 11, 12, 13]

Cepat dan hemat, tapi jarang dipakai

Big-O bilang seberapa cepat kerja algoritma bertambah saat datanya bertambah. O(n) artinya datanya dua kali lipat, waktunya kira-kira dua kali lipat.

Kenapa jarang dipakai? heapify melompat-lompat ke index 2i + 1 dan 2i + 2 yang letaknya berjauhan. CPU punya cache, memori kecil yang super cepat dan memuat data yang letaknya berdekatan sekaligus. Lompatan jauh bikin cache sering meleset. Quick sort dan merge sort membaca data berurutan, jadi di praktik biasanya lebih cepat, walau Big-O-nya setara.

⚠️ Jebakan yang sering ketemu

TL;DR: Max-heap adalah array yang dibaca sebagai pohon (anak dari i di 2i + 1 dan 2i + 2), dengan tiap parent lebih besar dari anaknya, jadi root di index 0 selalu yang terbesar. Heap sort membangun max-heap, lalu berulang kali menukar root ke ujung dan memperbaiki heap yang menyusut. Selalu O(n log n), memori tambahan O(1), gak stabil. Jarang dipakai karena lompatannya bikin cache CPU sering meleset.

Yang akan kamu pelajari