🔢 9.3: Heap Sort

Heap Kullanarak O(n log n) Sıralama

🎯 Heap Sort Nedir?

Heap Sort, heap veri yapısını kullanarak dizi sıralama algoritmasıdır.

💡 Ana Fikir

  1. Diziyi Max Heap'e çevir (Heapify)
  2. Root (en büyük) her seferinde son eleman ile swap yap
  3. Heap boyutunu 1 azalt, root'u tekrar heapify yap
  4. Heap boşalana kadar tekrarla

Sonuç: Küçükten büyüğe sıralı dizi!

⚡ Heap Sort Özellikleri

  • Zaman: Her durumda O(n log n)
  • Yer: O(1) - In-place sorting
  • Stable değil: Aynı değerli elemanların sırası bozulabilir
  • Worst case garantili: Quick sort'tan daha güvenilir

🎬 İnteraktif Heap Sort Animasyonu

Heap sort algoritmasının çalışmasını adım adım izleyin!

🧪 Heap Sort Görselleştirme

Durum: Başlamaya hazır. "Başlat" butonuna basın!

📊 Adım Detayları

Algoritma başlamadı...

🌳 Heap Sort - Ağaç Görselleştirmesi

Heap yapısının her adımda nasıl değiştiğini görün

🧪 Heap Ağacı Animasyonu

Build heap ve extract adımlarını izleyin

Adım 1: Rastgele diziyi max heap'e çevirme

📝 Heap Sort Algoritması - Python Kodu

Heap Sort - Adım Adım
def heapify(arr, n, i):
    """i'nci elemanı heap'te aşağı batır"""
    largest = i
    left = 2 * i + 1
    right = 2 * i + 2

    if left < n and arr[left] > arr[largest]:
        largest = left

    if right < n and arr[right] > arr[largest]:
        largest = right

    if largest != i:
        arr[i], arr[largest] = arr[largest], arr[i]
        heapify(arr, n, largest)

def heap_sort(arr):
    """Heap sort algoritması"""
    n = len(arr)

    print("=== HEAP SORT ===\n")
    print(f"Başlangıç: {arr}\n")

    # ADIM 1: Build Max Heap (Max Heap Oluştur)
    print("ADIM 1: Build Max Heap (Max Heap Oluştur)")
    print("-" * 40)

    for i in range(n // 2 - 1, -1, -1):
        heapify(arr, n, i)

    print(f"Max Heap: {arr}")
    print(f"Root (en büyük): {arr[0]}\n")

    # ADIM 2: Extract elemanları tek tek (Elemanları Çıkar ve Sırala)
    print("ADIM 2: Extract & Sort (Çıkar ve Sırala)")
    print("-" * 40)

    for i in range(n - 1, 0, -1):
        # Root'u (en büyük) sona taşı
        arr[0], arr[i] = arr[i], arr[0]
        print(f"Swap: 0 ↔ {i} → {arr}")
        print(f"  Sıralanmış kısım: {arr[i:]} ✅")

        # Kalan heap'i düzelt
        heapify(arr, i, 0)
        print(f"  Heapify sonrası: {arr[:i]} (heap) + {arr[i:]} (sıralı)")
        print()

    print(f"✅ Sıralama tamamlandı: {arr}")
    return arr

# Test
arr = [12, 11, 13, 5, 6, 7]
sorted_arr = heap_sort(arr.copy())

# Doğrulama
print("\n=== Doğrulama ===")
print(f"Sıralı mı? {sorted_arr == sorted(sorted_arr)}")
print(f"Sonuç: {sorted_arr}")
Çıktı bekleniyor...

⚖️ Heap Sort vs Diğer Sıralama Algoritmaları

Algoritma Best Average Worst Space Stable
Heap Sort O(n log n) O(n log n) O(n log n) ✅ O(1)
Quick Sort O(n log n) O(n log n) O(n²) ❌ O(log n)
Merge Sort O(n log n) O(n log n) O(n log n) O(n) ❌

🎯 Heap Sort Ne Zaman Kullanılır?

  • Worst case garantisi önemliyse (embedded sistemler)
  • Bellek kısıtlı (O(1) extra space)
  • ❌ Stable sorting gerekiyorsa kullanma (Merge Sort kullan)
  • ❌ Küçük dizilerde (Insertion Sort daha hızlı)

📋 Özet

✅ Bu Bölümde Öğrendikleriniz

  • Heap Sort: Build heap → Extract max tekrar tekrar
  • Zaman: O(n log n) - her durumda garantili!
  • Yer: O(1) - In-place sıralama
  • Avantaj: Worst case garantisi, az bellek
  • Dezavantaj: Stable değil, pratikte cache friendly değil
  • Animasyonlar: Hem bar chart hem de ağaç görselleştirmesi ile adım adım izlediniz