🫧 7.2: Bubble Sort (Kabarcık Sıralama)

En Basit Sıralama Algoritması

📌 Bubble Sort Nedir?

Bubble Sort, yan yana elemanları karşılaştırıp büyük olanı sağa taşıyan basit bir sıralama algoritmasıdır. Her geçişte en büyük eleman su içindeki kabarcık gibi "yukarı çıkar".

🎯 Algoritma Mantığı

  1. Dizinin başından sonuna kadar git
  2. Her adımda yan yana iki elemanı karşılaştır
  3. Soldaki büyükse → İkisini takas et (swap)
  4. Dizinin sonuna ulaşınca, en büyük eleman sonda olur
  5. Bu işlemi (n-1) kez tekrarla

🎮 İnteraktif Bubble Sort Simülasyonu

0
Karşılaştırma
0
Takas
0
Geçiş (Pass)
🎯 "Başlat" butonuna tıklayarak sıralamayı izleyin.
1000
Bekleyen Karşılaştırılan Takas Yapılan Sıralanmış

💡 Geçiş (Pass) Nedir?

Geçiş (Pass), dizinin başından sonuna kadar yapılan bir tam taramadır. Her geçişte, yan yana duran elemanlar sırayla karşılaştırılır ve gerekirse yer değiştirilir. Bir geçiş tamamlandığında, o geçişte en büyük olan eleman mutlaka dizinin sonuna (henüz sıralanmamış kısmın sonuna) ulaşmış olur.

Örneğin: 6 elemanlı bir dizide 5 geçiş yapılır. Birinci geçişte en büyük eleman en sona, ikinci geçişte ikinci en büyük sondan bir önceki konuma yerleşir. Bu şekilde her geçişte bir eleman daha yerini bulur.

Yukarıdaki gösterge: 2 = Şu anda 2. geçiş yapılıyor 1 = 1. geçiş tamamlandı, en büyük eleman yerinde

📊 Karmaşıklık Analizi

Durum Zaman Açıklama
En İyi O(n) Dizi zaten sıralı (optimizasyonlu versiyon)
Ortalama O(n²) Rastgele sıralı dizi
En Kötü O(n²) Ters sıralı dizi
Alan O(1) In-place, ek bellek gerekmez
📐 Neden O(n²)?

n elemanlı dizi için:
• 1. geçiş: (n-1) karşılaştırma
• 2. geçiş: (n-2) karşılaştırma
• ...
• Toplam: (n-1) + (n-2) + ... + 1 = n(n-1)/2 ≈ n²/2 = O(n²)

💻 Python Implementasyonları

1. Temel Versiyon

Python Kodu
def bubble_sort_basic(arr):
    """Temel Bubble Sort"""
    n = len(arr)
    comparisons = 0
    swaps = 0

    for i in range(n - 1):
        print(f"\n--- Geçiş {i + 1} ---")

        for j in range(n - 1 - i):
            comparisons += 1
            print(f"Karşılaştır: arr[{j}]={arr[j]} vs arr[{j+1}]={arr[j+1]}", end="")

            if arr[j] > arr[j + 1]:
                arr[j], arr[j + 1] = arr[j + 1], arr[j]
                swaps += 1
                print(f" → TAKAS!")
            else:
                print(f" → OK")

        print(f"Dizi: {arr}")

    return comparisons, swaps

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

karsilastirma, takas = bubble_sort_basic(dizi.copy())
print(f"\n{'='*40}")
print(f"Sonuç: {dizi}")
print(f"Toplam karşılaştırma: {karsilastirma}")
print(f"Toplam takas: {takas}")
Çıktı bekleniyor...

2. Optimizasyonlu Versiyon (Early Termination)

Python Kodu
def bubble_sort_optimized(arr):
    """
    Optimizasyonlu Bubble Sort

    Eğer bir geçişte hiç takas olmadıysa,
    dizi zaten sıralıdır - erken çık!
    """
    n = len(arr)
    comparisons = 0

    for i in range(n - 1):
        swapped = False  # Bu geçişte takas oldu mu?

        for j in range(n - 1 - i):
            comparisons += 1
            if arr[j] > arr[j + 1]:
                arr[j], arr[j + 1] = arr[j + 1], arr[j]
                swapped = True

        print(f"Geçiş {i+1}: {arr}")

        # Takas olmadıysa, dizi sıralı!
        if not swapped:
            print(f"✅ Takas yok - Erken çıkış!")
            break

    return comparisons

# Test 1: Normal dizi
print("Test 1: Normal Dizi")
dizi1 = [64, 34, 25, 12, 22, 11]
print(f"Başlangıç: {dizi1}")
comp1 = bubble_sort_optimized(dizi1)
print(f"Karşılaştırma: {comp1}\n")

# Test 2: Zaten sıralı dizi
print("Test 2: Zaten Sıralı Dizi")
dizi2 = [11, 12, 22, 25, 34, 64]
print(f"Başlangıç: {dizi2}")
comp2 = bubble_sort_optimized(dizi2)
print(f"Karşılaştırma: {comp2}")
print("\n💡 Sıralı dizide sadece 1 geçiş yeterli!")
Çıktı bekleniyor...

📝 Adım Adım Örnek

Başlangıç: [5, 3, 8, 4, 2]

Geçiş 1:

  • [5, 3, 8, 4, 2] → 5 > 3? Evet → Takas → [3, 5, 8, 4, 2]
  • [3, 5, 8, 4, 2] → 5 > 8? Hayır → [3, 5, 8, 4, 2]
  • [3, 5, 8, 4, 2] → 8 > 4? Evet → Takas → [3, 5, 4, 8, 2]
  • [3, 5, 4, 8, 2] → 8 > 2? Evet → Takas → [3, 5, 4, 2, 8]

Geçiş 1 sonucu: [3, 5, 4, 2, 8] ← En büyük yerinde!

Geçiş 2:

  • [3, 5, 4, 2, 8] → Takas yok
  • [3, 5, 4, 2, 8] → Takas → [3, 4, 5, 2, 8]
  • [3, 4, 5, 2, 8] → Takas → [3, 4, 2, 5, 8]

Geçiş 2 sonucu: [3, 4, 2, 5, 8]

... (devam eder)

Final: [2, 3, 4, 5, 8]

✅ Avantajları ve ❌ Dezavantajları

✅ Avantajları

  • Basit: Anlaması ve yazması kolay
  • In-place: O(1) ek alan
  • Stabil: Eşit elemanların sırası korunur
  • Adaptive: Sıralı dizide O(n)
  • Öğretici: Sıralama mantığını öğrenmek için ideal

❌ Dezavantajları

  • Yavaş: O(n²) - büyük verilerde kullanılamaz
  • Çok takas: Diğer O(n²) algoritmalardan daha fazla
  • Pratikte kullanılmaz: Daha iyi alternatifler var

🆚 Selection Sort ile Karşılaştırma

Özellik Bubble Sort Selection Sort
Karşılaştırma Sayısı O(n²) O(n²)
Takas Sayısı O(n²) - Çok O(n) - Az
Stabil mi? ✅ Evet ❌ Hayır
Adaptive mi? ✅ Evet (O(n)) ❌ Hayır