Birleştirmeli Sıralama
Diziyi ikiye bölüp sıralı yarıları birleştiren böl ve yönet algoritması.
Önce bunlara göz at
#Nasıl çalışır?
Birleştirmeli sıralama (merge sort), "böl ve yönet" yaklaşımını kullanır: diziyi ikiye böler, her yarıyı ayrı ayrı sıralar, sonra iki sıralı yarıyı birleştirir.
Bölme işlemi, parçalar tek elemana inene kadar özyinelemeli olarak devam eder. Tek elemanlı bir dizi zaten sıralıdır.
Asıl iş birleştirme adımında yapılır: iki sıralı yarının en öndeki elemanları karşılaştırılır, küçük olan sonuca alınır. Bir yarı bitince diğerinin kalanı olduğu gibi eklenir.
#Canlı animasyon
Dizi tek elemanlı parçalara kadar ikiye bölünür, sonra parçalar sıralı biçimde birleştirilir.
mergeSort(a, lo, hi):if lo >= hi: returnmid = (lo + hi) / 2mergeSort(a, lo, mid); mergeSort(a, mid + 1, hi)merge: repeatedly take the smaller front elementappend whatever is left
#Adım adım
- 01Dizi tek elemanlıysa zaten sıralıdır; geri dön.
- 02Diziyi ortadan ikiye böl.
- 03Sol yarıyı merge sort ile sırala.
- 04Sağ yarıyı merge sort ile sırala.
- 05İki sıralı yarıyı birleştir: her adımda iki yarının önündeki elemanlardan küçük olanı al, sonra kalanları ekle.
#Örnek kod
Aynı algoritma 8 dilde. Her program derlenip çalıştırılarak test edildi ve hepsi aynı çıktıyı veriyor.
def merge_sort(a: list[int]) -> list[int]:
if len(a) <= 1:
return a
mid = len(a) // 2
left = merge_sort(a[:mid])
right = merge_sort(a[mid:])
merged = []
i = j = 0
while i < len(left) and j < len(right):
# "<=" takes from the left on ties, which keeps the sort stable.
if left[i] <= right[j]:
merged.append(left[i])
i += 1
else:
merged.append(right[j])
j += 1
merged.extend(left[i:])
merged.extend(right[j:])
return merged
print(*merge_sort([5, 1, 4, 2, 8, 3]))#Karmaşıklık
| En iyi | O(n log n) |
|---|---|
| Ortalama | O(n log n) |
| En kötü | O(n log n) |
| Ek bellek | O(n) |
| Kararlı mı? | Evet |
| Yerinde mi? | Hayır |
Dizi log₂ n kez ikiye bölünür ve her seviyede toplam n eleman birleştirilir: n · log n. Bu süre verinin sırasından bağımsızdır, en kötü durumda bile O(n log n) garanti edilir. Birleştirme için genellikle n boyutunda yardımcı bir dizi gerekir. (Animasyonda elemanları kaydırarak yerinde birleştiriyoruz ki hareketleri görebilesin.)
#Ne zaman kullanılır?
Garanti edilmiş O(n log n) süre ve kararlılık gerektiğinde idealdir. Bağlı listeleri sıralamak ve belleğe sığmayan büyük verileri dosyalar üzerinde sıralamak (external sort) için de standart yöntemdir. Python ve Java'nın nesne sıralaması merge sort tabanlı Timsort kullanır.
#Alıştırma
Soruları cevaplamak ve ilerlemeni kaydetmek için giriş yap.
Kolay
Merge sort hangi yaklaşımı kullanır?
- 1Böl ve yönet
- 2Açgözlü (greedy)
- 3Dinamik programlama
- 4Geri izleme (backtracking)
Merge sort'un en kötü durum zaman karmaşıklığı nedir?
- 1O(n log n)
- 2O(n²)
- 3O(n)
- 4O(log n)
Klasik merge sort ne kadar ek bellek kullanır?
- 1O(n)
- 2O(1)
- 3O(log n)
- 4O(n²)
Orta
[2, 5, 8] ve [1, 6, 9] sıralı yarıları birleştirilirken ilk alınan iki eleman hangileridir?
- 11, sonra 2
- 22, sonra 1
- 31, sonra 6
- 42, sonra 5
Zor
Merge sort'u kararlı yapan birleştirme kuralı hangisidir?
- 1Eşitlik durumunda soldaki yarıdan almak
- 2Eşitlik durumunda sağdaki yarıdan almak
- 3Her zaman büyük olanı almak
- 4Yarıları rastgele seçmek
#Bundan sonra
Bu dersi bildiğini varsayan dersler: