Menu
Coddy logo textTech

Heap Sort

Son güncelleme

Heap sort diziyi bir ikili yığın (heap) olarak ele alır. Önce bir max-heap oluşturur, böylece en büyük eleman kökte (indeks 0) yer alır. Ardından kökü sıralanmamış son elemanla tekrar tekrar takas eder - en büyüğü yerine sabitler - ve heap özelliğini yeniden sağlamak için yeni kökü aşağı sızdırır. Yığının oluşturulmasını ve çıkarmaları izlemek için yukarıdaki oynat düğmesine basın.

Heap sort merge sort gibi O(n log n) zamanı garanti eder, ancak yalnızca O(1) ek alanla yerinde sıralar. Kararlı değildir ve quicksort'a göre daha kötü önbellek davranışı gösterme eğilimindedir; bu yüzden hem garantili bir sınır hem de sabit bellek önemli olduğunda sıkça tercih edilir.

Zaman ve alan karmaşıklığı

DurumKarmaşıklıkNotlar
En iyi durumO(n log n)Oluşturma + n çıkarma
Ortalama durumO(n log n)Rastgele sıra
En kötü durumO(n log n)Garantili
AlanO(1)Yerinde
KararlıHayırAşağı sızdırma eşit elemanları yeniden sıralar

Adım adım

AdımNe olur
1Diziden bir max-heap oluştur (son ebeveynden başlayarak aşağı sızdır).
2Kökü (en büyüğü) yığının son elemanıyla takas et.
3Yığını bir küçült - o son yuva artık sıralı.
4Max-heap özelliğini geri getirmek için yeni kökü aşağı sızdır.
5Yığında tek eleman kalana kadar tekrarla.

Çözümlü örnek

[3, 1, 6, 5, 2, 4] sıralanıyor. | çubuğu küçülen yığın ile sıralı kuyruk arasındaki sınırı gösterir:

GeçişDiziİşlem
Yığın oluştur[6, 5, 4, 1, 2, 3]Max-heap oluşturmak için son ebeveynden aşağı sızdır; 6 artık kökte.
1[5, 3, 4, 1, 2 | 6]Kök 6 ile son yuvayı takas et, yığını küçült ve 3'ü aşağı sızdır.
2[4, 3, 2, 1 | 5, 6]Kök 5'i çıkar, ardından 2'yi aşağı sızdır ki 4 köke yükselsin.
3[3, 1, 2 | 4, 5, 6]Kök 4'ü çıkar, ardından 1'i aşağı sızdır ki 3 köke yükselsin.
4[2, 1 | 3, 4, 5, 6]Kök 3'ü çıkar; 2 zaten heap özelliğini sağlıyor.
5[1 | 2, 3, 4, 5, 6]Kök 2'yi çıkar; tek eleman kaldı, yani dizi sıralı.

Heap sort ne zaman kullanılır

KullanınKullanmayın
O(n²) riski olmadan garantili O(n log n) en kötü durum gerektiğinde.Eşit anahtarların sırasını koruyan kararlı bir sıralama gerektiğinde.
Bellek kısıtlıysa - yalnızca O(1) ek alanla yerinde sıralar.Önbellek performansı önemliyse ve veri belleğe sığıyorsa - quicksort genellikle daha hızlıdır.
Veri üzerinde zaten bir yığın (örneğin öncelik kuyruğu) tutuyorsanız.En az karşılaştırmayı istiyorsanız - merge sort ve quicksort pratikte genellikle daha az yapar.
Güvenilmeyen girdi quicksort'un en kötü durumunu tetikleyebilir ve rastgeleleştiremiyorsanız.Veri neredeyse sıralıysa - insertion sort onun üzerinde neredeyse doğrusal zamanda çalışır.

Heap Sort kodu

Python, JavaScript, Java, C++, C dillerinde temiz ve çalıştırılabilir bir Heap Sort uygulaması. Bir dil seçin, kodu kopyalayın veya Coddy Playground'da hazır yüklenmiş olarak açın.

Python ile Heap Sort kodu

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)
Bu kodu Python Playground'da çalıştır

Heap Sort SSS

Heap sort'un zaman karmaşıklığı nedir?
Heap sort en iyi, ortalama ve en kötü durumda O(n log n)'dir. Yığını oluşturmak O(n)'dir ve n çıkarmanın her biri O(log n) maliyetindedir. O(1) ek alan kullanır.
Heap sort kararlı mıdır?
Hayır. Aşağı sızdırma işlemi eşit elemanları birbirinin üzerinden geçirebilir, bu yüzden heap sort eşit anahtarların göreli sırasını korumaz.
Heap sort'u ne zaman kullanmalıyım?
Yalnızca O(1) ek bellekle garantili O(n log n) en kötü durum gerektiğinde heap sort'u kullanın. Quicksort'un O(n²) riskinden, merge sort'un O(n) arabelleği olmadan kaçınır; bunun bedeli kararlılık ve önbellek performansıdır.
Heap sort ile quicksort arasındaki fark nedir?
İkisi de yerinde sıralar, ancak quicksort'un O(n²) en kötü durumu varken heap sort O(n log n) garanti eder. Pratikte quicksort daha iyi önbellek yerelliği ve daha az takas nedeniyle genellikle daha hızlıdır, bu yüzden heap sort esas olarak en kötü durum sınırının garanti edilmesi gerektiğinde tercih edilir.
Heap sort bir öncelik kuyruğuyla nasıl ilişkilidir?
İkili yığın bir öncelik kuyruğunun standart uygulamasıdır ve heap sort esasen o kuyruktan tekrar tekrar en büyüğü çekmektir. Verilerinizi zaten bir yığında tutuyorsanız, elemanları tek tek çıkarmak size sıralı düzeni bedavaya verir.
Heap sort bir max-heap mi yoksa min-heap mi gerektirir?
Yerinde artan düzende sıralamak için bir max-heap kullanın: en büyük eleman her geçişte sona takas edilir ve sıralı kuyruk sağdan büyür. Bir min-heap yerinde azalan düzen üretir; ayrı bir diziye çıkarırsanız artan düzen üretir.
Coddy programming languages illustration

Coddy ile algoritmalarda ustalaş

BAŞLA