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

$ merge_sort --visualizeAdım 1/57

Dizi tek elemanlı parçalara kadar ikiye bölünür, sonra parçalar sıralı biçimde birleştirilir.

Karşılaştırma: 0Taşıma: 0KarşılaştırılıyorSoldan alındıSağdan alındıYerine oturdu
mergeSort(a, lo, hi):
if lo >= hi: return
mid = (lo + hi) / 2
mergeSort(a, lo, mid); mergeSort(a, mid + 1, hi)
merge: repeatedly take the smaller front element
append whatever is left

#Adım adım

  1. 01Dizi tek elemanlıysa zaten sıralıdır; geri dön.
  2. 02Diziyi ortadan ikiye böl.
  3. 03Sol yarıyı merge sort ile sırala.
  4. 04Sağ yarıyı merge sort ile sırala.
  5. 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 iyiO(n log n)
OrtalamaO(n log n)
En kötüO(n log n)
Ek bellekO(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

1/3

Merge sort hangi yaklaşımı kullanır?

  • 1Böl ve yönet
  • 2Açgözlü (greedy)
  • 3Dinamik programlama
  • 4Geri izleme (backtracking)

Orta

1/1

[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

1/1

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: