Menu
CoddyTech

Heap Sort

Terakhir diperbarui

Heap sort adalah algoritma pengurutan yang memperlakukan array sebagai binary heap. Pertama, algoritma ini membangun max-heap, sehingga elemen terbesar berada di root (indeks 0). Lalu, algoritma ini berulang kali menukar root dengan elemen terakhir yang belum terurut, sehingga nilai maksimum terkunci di tempatnya, dan menurunkan (sift down) root yang baru untuk memulihkan sifat heap. Tekan Putar di atas untuk melihat heap dibangun dan nilai-nilainya diambil.

Heap sort menjamin waktu O(n log n) seperti merge sort, tetapi mengurutkan secara in-place dengan ruang tambahan hanya O(1). Algoritma ini tidak stabil dan cenderung punya perilaku cache yang lebih buruk daripada quicksort, jadi sering dipilih saat batas yang terjamin dan memori konstan sama-sama penting.

Kompleksitas waktu dan ruang

KasusKompleksitasCatatan
Kasus terbaikO(n log n)Pembangunan + n pengambilan
Kasus rata-rataO(n log n)Urutan acak
Kasus terburukO(n log n)Terjamin
RuangO(1)In-place
StabilTidakSift-down mengubah urutan elemen yang sama

Langkah demi langkah

LangkahApa yang terjadi
1Bangun max-heap dari array (sift down mulai dari induk terakhir).
2Tukar root (nilai maksimum) dengan elemen terakhir heap.
3Perkecil heap satu elemen: slot terakhir itu kini sudah terurut.
4Sift down root yang baru untuk memulihkan sifat max-heap.
5Ulangi sampai heap tinggal satu elemen.

Contoh penerapan

Mengurutkan [3, 1, 6, 5, 2, 4]. Garis | menandai batas antara heap yang menyusut dan bagian akhir yang sudah terurut:

PutaranArrayAksi
Bangun heap[6, 5, 4, 1, 2, 3]Sift down mulai dari induk terakhir untuk membangun max-heap; 6 kini ada di root.
1[5, 3, 4, 1, 2 | 6]Tukar root 6 dengan slot terakhir, perkecil heap, lalu sift down 3.
2[4, 3, 2, 1 | 5, 6]Keluarkan root 5 lewat penukaran, lalu sift down 2 sehingga 4 naik ke root.
3[3, 1, 2 | 4, 5, 6]Keluarkan root 4 lewat penukaran, lalu sift down 1 sehingga 3 naik ke root.
4[2, 1 | 3, 4, 5, 6]Keluarkan root 3 lewat penukaran; 2 sudah memenuhi sifat heap.
5[1 | 2, 3, 4, 5, 6]Keluarkan root 2 lewat penukaran; tersisa satu elemen, jadi array sudah terurut.

Kapan memakai heap sort

Pakai saatHindari saat
Kamu butuh kasus terburuk O(n log n) yang terjamin tanpa risiko O(n²).Kamu butuh pengurutan stabil yang mempertahankan urutan key yang sama.
Memori terbatas: heap sort mengurutkan secara in-place dengan ruang tambahan hanya O(1).Performa cache penting dan datanya muat di memori: quicksort biasanya lebih cepat.
Kamu sudah memelihara heap (misalnya priority queue) atas datanya.Kamu ingin perbandingan sesedikit mungkin: merge sort dan quicksort sering melakukan lebih sedikit dalam praktik.
Input yang tidak tepercaya bisa memicu kasus terburuk quicksort dan kamu tidak bisa mengacaknya.Datanya hampir terurut: insertion sort berjalan dalam waktu hampir linear pada data seperti itu.

Kode Heap Sort

Implementasi Heap Sort yang rapi dan siap dijalankan dalam Python, JavaScript, Java, C++, C. Pilih bahasa, salin kodenya, atau buka langsung di Coddy Playground.

Kode Heap Sort dalam 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)
Jalankan kode ini di Playground Python

FAQ Heap Sort

Berapa kompleksitas waktu heap sort?
Heap sort bernilai O(n log n) pada kasus terbaik, rata-rata, dan terburuk. Membangun heap bernilai O(n) dan setiap pengambilan dari n pengambilan berbiaya O(log n). Ruang tambahan yang dipakai O(1).
Apakah heap sort stabil?

Tidak. Operasi sift-down bisa memindahkan elemen yang sama melewati satu sama lain, jadi heap sort tidak mempertahankan urutan relatif key yang sama.

Kapan sebaiknya memakai heap sort?
Pakai heap sort saat kamu butuh kasus terburuk O(n log n) yang terjamin dengan memori tambahan hanya O(1). Algoritma ini menghindari risiko O(n²) milik quicksort tanpa buffer O(n) milik merge sort, dengan mengorbankan stabilitas dan performa cache.
Apa perbedaan heap sort dan quicksort?
Keduanya mengurutkan secara in-place, tetapi quicksort punya kasus terburuk O(n²), sedangkan heap sort menjamin O(n log n). Dalam praktik, quicksort biasanya lebih cepat karena lokalitas cache yang lebih baik dan penukaran yang lebih sedikit, jadi heap sort terutama dipilih saat batas kasus terburuk harus terjamin.
Apa hubungan heap sort dengan priority queue?

Binary heap adalah implementasi standar priority queue, dan heap sort pada dasarnya adalah mengeluarkan nilai maksimum dari queue itu berulang kali. Jika datamu sudah disimpan di dalam heap, mengambil elemen satu per satu langsung memberimu urutan terurut.

Apakah heap sort butuh max-heap atau min-heap?

Untuk mengurutkan secara naik dan in-place, pakai max-heap: elemen terbesar ditukar ke ujung pada setiap putaran, sehingga bagian akhir yang terurut tumbuh dari kanan. Min-heap akan menghasilkan urutan turun secara in-place, atau urutan naik jika kamu mengambil elemennya ke array terpisah.

Ilustrasi bahasa pemrograman di Coddy

Kuasai algoritma bersama Coddy

Mulai