En Basit Sıralama Algoritması
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".
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.
| 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 |
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²)
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}")
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!")
Başlangıç: [5, 3, 8, 4, 2]
Geçiş 1 sonucu: [3, 5, 4, 2, 8] ← En büyük yerinde!
Geçiş 2 sonucu: [3, 4, 2, 5, 8]
... (devam eder)
Final: [2, 3, 4, 5, 8]
| Ö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 |