Birleştirme Sıralaması

Kısaca: Birleştirme Sıralaması (``Merge Sort``), bilgisayar bilimlerinde Q (n log(n)) derecesinde karmaşıklığa sahip bir sıralama algoritmasıdır. Girdi olarak aldığı diziyi en küçük hale gelene kadar ikili gruplara böler ve karşılaştırma metoduyla sıralı olarak çıkartır. ...devamı ☟

Birleştirme sıralaması
Birleştirme Sıralaması

Birleştirme Sıralaması (``Merge Sort``), bilgisayar bilimlerinde Q (n log(n)) derecesinde karmaşıklığa sahip bir sıralama algoritmasıdır. Girdi olarak aldığı diziyi en küçük hale gelene kadar ikili gruplara böler ve karşılaştırma metoduyla sıralı olarak çıkartır.

Algoritma

Algoritmanın çalışması kavramsal olarak şöyledir:
  1. Sıralı olmayan listeyi ortadan eşit olarak iki alt listeye ayırır.
  2. Alt listeleri kendi içinde sıralar.
  3. Sıralı iki alt listeyi tek bir sıralı liste olacak şekilde birleştirir.


Bu algoritma John von Neumann tarafından 1945 yılında bulunmuştur. Sözde kod formatındaki bir algoritma örneği aşağıdaki gibidir.

function mergesort(m)
 var list left, right
 if length(m) a‰¤ 1
   return m
 else
   middle = length(m) / 2
   for each x in m up to middle
     add x to left
   for each x in m after middle
     add x to right
   left = mergesort(left)
   right = mergesort(right)
   result = merge(left, right)
   return result


Yukarıda kullanılan merge() fonksiyonunun değişik şekilleri olabilir. Bunlardan en basiti şöyledir.

function merge(left,right)
 var list result
 while length(left) > 0 and length(right) > 0
   if first(left) a‰¤ first(right)
     append first(left) to result
     left = rest(left)
   else
     append first(right) to result
     right = rest(right)
 if length(left) > 0 
   append left to result
 if length(right) > 0 
   append right to result
 return result


Analiz

Birleştirme sıralaması örneğinde rasgele sayılardan oluşan bir liste sıralanıyor. Örnek olarak n adet elemanın sıralandığını düşünelim. Birleştirme sıralamasının ortalama durum ve en kötü durum olarak iki analizi vardır. Uzunluğu n olan bir liste üzerinde birleştirme sıralamasının işletim zamanı T(n) olsun. Bu sıralama bölünen alt listelere tekrarlı olarak uygulanırsa algoritmanın tanımından T(n)=2T(n/2)+n olur (Algoritmayı 2 alt listeye uygula ve birleşimden doğacak n basamağı ekle). Daha geniş bir analiz için master teoremine bakınız.

En kötü durum analizinde (n lb n - 2<\lceil>lb n<\rceil> + 1) olur. Bu da (n lb n - n + 1) ile (n lb n + n + O(lb n)) arasındadır (Burada Ib 2 tabanında logaritmadır). Bazı alt listelerin sıralanmış geldiğini düşünürsek ve n sayısı çok büyükken yapılan karşılaştırma sayısı en kötü durumdan x.n kez daha azdır.

Birleştirme sıralaması en kötü durum performansında bile ortalama durumda çalışan bir hızlı sıralama algoritmasından %39 civarında daha az karşılaştırma yapar. İki algoritmanın eş zamanlı olarak çalıştığı durumda yani birleştirme sıralamasının en kötü durum performansı hızlı sıralamanın en iyi durumuna eşit olduğunda iki algoritmanın da karmaşıklığı Q(n logn) olarak eşittir. Birleştirme sıralamasının en iyi durumu en kötü durumun yarısı kadar karşılaştırma yapar.

Birleştirme sıralama fonksiyonu çağırıldığında, diziyi ikiye bölüp sadece iki diziyi sıraladığını düşünürsek oluşan her alt dizi için fonksiyonu tekrar tekrar çağırmamız gerekir. Bu da fonksiyonun 2n -l kez işlem görmesi demektir. Hızlı sıralama ise en kötü durumda bile n kez işlem görür. Bu durumda birleştirme sıralamasının hızlı sıralamaya oranla neredeyse iki kat bir maliyeti ortaya çıkar. Bundan sakınmak için fonksiyonun içine kendi kendini çağıran iteratif bir yapı koymak basit ve etkili bir çözümdür. Genellikle birleştirme sıralaması uygulamalarında verinin son hali girdi için ayrılan alana kaydedildiğinden bellekte ayrıca bir yer kaplamaz. Sıralama işlemini başka bir bellek alanında yapmak da mümkündür. Fakat bu oldukça karmaşıktır. Bu işlem performans olarak kazançlı olsa bile algoritma işletim zamanı hala Q(nlong)`dir. Bu tip durumlarda algoritma yığın sıralama algoritması gibi çalışır. Sıralı erişim prensibine göre çalışan veri yapılarında birleştirme sıralaması hızlı sıralamaya oranla daha etkilidir.

Birleştirme sıralamasının optimizasyonu

Günümüz modern bilgisayarlarında konumsal yerellik ilkesi yazılım optimizasyonunda çok önemlidir. Bunun nedeni günümüzdeki çok katlı bellek sıradüzenselliğinin kullanımıdır.

Bir anlayışa göre ana RAM hızlı bir kaset sürücü gibi düşünülebilir. Ve daha hızlı olan ön bellekler. Ön belleğin tekrar tekrar yüklenmesi kabul edilemez zaman kayıplarını dayatmaktadır. Bu nedenle titiz bir birleştirme sıralaması işletim zamanında olumlu iyileştirmeler yapar. Fakat bu düşünce çok hızlı bellek elemanlarının ucuzlaması ve mimari de daha yaygın olarak kullanılmasıyla tersine de dönebilir.

Sonuç olarak bir birleştirme sıralaması tasarlamak, donanımsal değişiklikler gerektirir. Örneğin kaset sürücülerinin sayısında boyutunda veya hızında bazı değişiklikler yapılmalıdır.

Kaynaklar

Vikipedi

Bu konuda henüz görüş yok.
Görüş/mesaj gerekli.
Markdown kullanılabilir.