📥 7.4: Insertion Sort (Eklemeli Sıralama)

Kart Oyununda El Düzenleme Mantığı

📌 Insertion Sort Nedir?

Insertion Sort, her elemanı sıralı bölümde doğru yerine "sokan" bir algoritmadır. Kart oyunlarında elimizdeki kartları düzenleme mantığına benzer.

🃏 Kart Oyunu Analojisi

İskambil oynarken:

  1. Yeni bir kart çekersiniz
  2. Elinizdeki sıralı kartlara bakarsınız
  3. Yeni kartı doğru yerine sokarsınız
  4. Bu şekilde eliniz her zaman sıralı kalır!

🎮 İnteraktif Insertion Sort Simülasyonu

Sıralı Kısım (yerleşmiş kartlar) Yerleştirilecek Kart (eldeki) Karşılaştırılan Kart Bekleyen Kartlar
🎯 "Başlat" butonuna tıklayarak sıralamayı izleyin. Kırmızı çizgi, sıralı ve sıralanmamış kısımları ayırır.
500

💡 Nasıl Çalışır?

Insertion Sort, tıpkı elinize gelen iskambil kartlarını sıraya dizme gibi çalışır. Kırmızı renkli kart şu anda yerleştirilmeye çalışılan karttır. Bu kart, yeşil (sıralı) kısımda doğru yerine konulana kadar, kendinden büyük kartlar sağa kaydırılır.

Kırmızı çizgi sıralı kısmı (sol) ve henüz sıralanmamış kısmı (sağ) ayırır. Her adımda sıralı kısım büyür, sıralanmamış kısım küçülür.

📊 Karmaşıklık Analizi

Durum Zaman Açıklama
En İyi O(n) Dizi zaten sıralı - sadece n-1 karşılaştırma
Ortalama O(n²) Rastgele sıralı dizi
En Kötü O(n²) Ters sıralı dizi - her eleman en başa gider
💡 Insertion Sort'un Güçlü Yönü:

Neredeyse sıralı verilerde çok hızlıdır! Verinin büyük kısmı sıralıysa O(n)'e yakın çalışır. Bu nedenle küçük dizilerde veya hibrit algoritmalarda (Timsort) kullanılır.

💻 Python Implementasyonu

Python Kodu
def insertion_sort(arr):
    """
    Insertion Sort Algoritması

    Her elemanı sıralı bölümde doğru yerine "sokar".
    """
    n = len(arr)
    comparisons = 0
    shifts = 0

    for i in range(1, n):
        key = arr[i]  # Yerleştirilecek eleman
        j = i - 1

        print(f"\n--- Adım {i} ---")
        print(f"Yerleştirilecek: {key}")
        print(f"Sıralı bölüm: {arr[:i]}")

        # key'den büyük elemanları sağa kaydır
        while j >= 0 and arr[j] > key:
            comparisons += 1
            print(f"  {arr[j]} > {key} → Sağa kaydır")
            arr[j + 1] = arr[j]
            shifts += 1
            j -= 1

        if j >= 0:
            comparisons += 1
            print(f"  {arr[j]} ≤ {key} → Dur")

        arr[j + 1] = key
        print(f"Sonuç: {arr}")

    return comparisons, shifts

# Test
dizi = [64, 34, 25, 12, 22, 11]
print(f"Başlangıç: {dizi}\n")

comp, shift = insertion_sort(dizi)

print(f"\n{'='*40}")
print(f"Sonuç: {dizi}")
print(f"Karşılaştırma: {comp}")
print(f"Kaydırma: {shift}")
Çıktı bekleniyor...

🌟 Avantajları

💡 Pratikte Kullanım:

Python'un sort() fonksiyonu (Timsort), küçük parçaları Insertion Sort ile sıralar. Çünkü küçük dizilerde overhead'sız ve cache-friendly!

🆚 O(n²) Algoritmaları Karşılaştırma

Özellik Bubble Selection Insertion
En İyi Durum O(n) O(n²) O(n)
Takas Sayısı O(n²) O(n) O(n²)
Stabil
Online
Önerilen Kullanım Sadece öğretim Takas maliyetli Küçük/neredeyse sıralı