Menu
Coddy logo textTech

Merge Sort

Son güncelleme

Merge sort bir böl ve fethet algoritmasıdır. Diziyi her parça tek bir eleman içerene kadar (ki bu önemsiz biçimde sıralıdır) yinelemeli olarak ikiye böler, sonra parçaları sıralı biçimde geri birleştirir. Birleştirme adımı iki sıralı alt diziyi iki işaretçiyle dolaşır ve daima öndeki daha küçük elemanı bir sonraki olarak kopyalar. Dizinin birleştirme birleştirme yeniden inşa edildiğini görmek için yukarıdan oynat'a basın.

Her zaman ikiye böldüğü için merge sort her durumda O(n log n) zamanda çalışır - en kötü durumu en iyi durumu kadar iyidir. Bunun bedeli, geçici birleştirme arabelleği için O(n) ek alandır.

Zaman ve alan karmaşıklığı

DurumKarmaşıklıkNotlar
En iyi durumO(n log n)Girişi her zaman ikiye böler
Ortalama durumO(n log n)Rastgele sıra
En kötü durumO(n log n)Garantili - kötü giriş yok
AlanO(n)Birleştirme için geçici arabellek
KararlıEvetEşitlikler birleştirmede soldan öncelikli çözülür

Adım adım

AdımNe olur
1Aralıkta 0 veya 1 eleman varsa, zaten sıralıdır.
2Aralığı iki yarıya böl.
3Sol yarıyı yinelemeli olarak merge sort ile sırala.
4Sağ yarıyı yinelemeli olarak merge sort ile sırala.
5İki sıralı yarıyı iki işaretçiyle birleştir.

Çözümlü örnek

[5, 2, 4, 1] sıralanıyor:

GeçişDiziİşlem
Böl[5, 2] | [4, 1]Diziyi iki yarıya böl
Böl[5] [2] | [4] [1]Her parça tek eleman olana kadar tekrar böl
Birleştir[2, 5] | [1, 4][5],[2] parçalarını [2, 5]e ve [4],[1] parçalarını [1, 4]e birleştir
Birleştir[1, 2, 4, 5][2, 5] ve [1, 4] birleştir: önce 1, sonra 2, sonra 4, sonra 5 seç
Bitti[1, 2, 4, 5]Dizi tamamen sıralı

Merge sort ne zaman kullanılmalı

Şu durumda kullanŞu durumda kaçın
Garantili O(n log n) en kötü durum gerektiğindeBellek kısıtlı ve O(n) ek alan kabul edilemez olduğunda
Kararlılık önemli olduğunda (eşit anahtarlar sırasını korur)Insertion sort'un daha hızlı olduğu küçük dizileri sıraladığında
Bağlı liste sıraladığındaYerinde sıralama kesin bir gereksinim olduğunda
Veri RAM'e sığmayacak kadar büyük olduğunda (harici sıralama)Önbellek yerelliği baskın olduğunda ve quicksort'un yerinde geçişleri kazandığında

Merge Sort kodu

Python, JavaScript, Java, C++, C dillerinde temiz ve çalıştırılabilir bir Merge Sort uygulaması. Bir dil seçin, kodu kopyalayın veya Coddy Playground'da hazır yüklenmiş olarak açın.

Python ile Merge Sort kodu

Python
1def merge_sort(a):2    if len(a) <= 1:3        return a4    mid = len(a) // 25    left = merge_sort(a[:mid])6    right = merge_sort(a[mid:])7    return merge(left, right)8
9
10def merge(left, right):11    out = []12    i = j = 013    while i < len(left) and j < len(right):14        if left[i] <= right[j]:15            out.append(left[i])16            i += 117        else:18            out.append(right[j])19            j += 120    out.extend(left[i:])21    out.extend(right[j:])22    return out23
24
25nums = [38, 27, 43, 3, 9, 82, 10]26print("Before:", nums)27print("After: ", merge_sort(nums))
Bu kodu Python Playground'da çalıştır

Merge Sort SSS

Merge sort'un zaman karmaşıklığı nedir?
Merge sort en iyi, ortalama ve en kötü durumda O(n log n)'dir, çünkü diziyi her zaman ikiye böler. Birleştirme arabelleği için O(n) ek alan kullanır.
Merge sort kararlı mıdır?
Evet, birleştirme adımı eşitlikleri önce sol yarıdan alarak çözdüğünde. Bu, eşit elemanları orijinal göreli sıralarında tutar; bu nedenle merge sort kararlı sıralama için yaygın bir tercihtir.
Neden quicksort yerine merge sort kullanılır?
Merge sort düşmanca girişlerde bile O(n log n) garantiler ve kararlıdır, oysa quicksort O(n²)'ye düşebilir. Merge sort ayrıca bağlı listeler ve harici sıralama için tercih edilir. Dezavantajı O(n) ek bellektir.
Merge sort ile quicksort arasındaki fark nedir?
İkisi de böl ve fethet sıralamalarıdır, ancak quicksort bir pivot etrafında bölümler ve O(log n) yığın alanıyla yerinde sıralar, merge sort ise körü körüne ikiye böler ve O(n) arabellek kullanarak birleştirir. Quicksort önbellek yerelliği nedeniyle pratikte genellikle daha hızlıdır, ancak merge sort garantili O(n log n) en kötü duruma sahiptir ve kararlıdır.
Pratikte merge sort'u ne zaman kullanmalıyım?
Garantili O(n log n) sınırıyla kararlı bir sıralama gerektiğinde, bağlı listeleri sıralarken (rastgele erişime ihtiyaç duymaz) veya belleğe sığmayacak kadar büyük verilerin harici sıralamasını yaparken merge sort'a başvurun. Bellek kıt olduğunda ondan kaçının, çünkü O(n) ek alan gerektirir.
Merge sort yerinde sıralar mı?
Hayır. Standart merge sort iki yarıyı birleştirmek için O(n) geçici arabellek ayırır, bu yüzden yerinde değildir. Yerinde birleştirme türevleri vardır ama karmaşıktır ve ya daha yavaştır ya da kararlılığı kaybeder, bu nedenle arabellek tabanlı sürüm yaygın tercihtir.
Coddy programming languages illustration

Coddy ile algoritmalarda ustalaş

BAŞLA