Birleştirmeli sıralama - Vikipedi
İçeriğe atla
Ana menü
Gezinti
  • Anasayfa
  • Hakkımızda
  • İçindekiler
  • Rastgele madde
  • Seçkin içerik
  • Yakınımdakiler
Katılım
  • Deneme tahtası
  • Köy çeşmesi
  • Son değişiklikler
  • Dosya yükle
  • Topluluk portalı
  • Wikimedia dükkânı
  • Yardım
  • Özel sayfalar
Vikipedi Özgür Ansiklopedi
Ara
  • Bağış yapın
  • Hesap oluştur
  • Oturum aç
  • Bağış yapın
  • Hesap oluştur
  • Oturum aç

İçindekiler

  • Giriş
  • 1 Algoritma
  • 2 Karmaşıklık Hesabı
  • 3 Analiz
  • 4 Birleştirme sıralamasının optimizasyonu
  • 5 Algoritmanın kodları
  • 6 Kaynakça

Birleştirmeli sıralama

  • العربية
  • Azərbaycanca
  • Български
  • Čeština
  • Dansk
  • Deutsch
  • Ελληνικά
  • English
  • Esperanto
  • Español
  • Eesti
  • فارسی
  • Suomi
  • Français
  • Gaeilge
  • עברית
  • हिन्दी
  • Magyar
  • Հայերեն
  • Bahasa Indonesia
  • Íslenska
  • İtaliano
  • 日本語
  • Қазақша
  • ಕನ್ನಡ
  • 한국어
  • Lëtzebuergesch
  • Lombard
  • Lietuvių
  • മലയാളം
  • Nederlands
  • Norsk bokmål
  • Polski
  • Português
  • Română
  • Русский
  • Simple English
  • Slovenčina
  • Slovenščina
  • Српски / srpski
  • Svenska
  • ไทย
  • Українська
  • Oʻzbekcha / ўзбекча
  • Tiếng Việt
  • 中文
  • 粵語
Bağlantıları değiştir
  • Madde
  • Tartışma
  • Oku
  • Değiştir
  • Kaynağı değiştir
  • Geçmişi gör
Araçlar
Eylemler
  • Oku
  • Değiştir
  • Kaynağı değiştir
  • Geçmişi gör
Genel
  • Sayfaya bağlantılar
  • İlgili değişiklikler
  • Kalıcı bağlantı
  • Sayfa bilgisi
  • Bu sayfayı kaynak göster
  • Kısaltılmış URL'yi al
  • Karekodu indir
Yazdır/dışa aktar
  • Bir kitap oluştur
  • PDF olarak indir
  • Basılmaya uygun görünüm
Diğer projelerde
  • Wikimedia Commons
  • Vikiveri ögesi
Görünüm
Vikipedi, özgür ansiklopedi
(Birleştirmeli Sıralama sayfasından yönlendirildi)
Birleştirmeli sıralama
Birleştirmeli sıralamanın rastgele üretilmiş sayıları gösteren noktaları nasıl sıraladığını gösteren örnek
SınıfSıralama algoritması
Veri yapısıDizi
Zaman karmaşıklığıO(n log n)
En iyiО(n log n)
OrtalamaО(n log n)
Alan karmaşıklığıEn kötü durumda О(n)

Birleşmeli Sıralama (Merge Sort), bilgisayar bilimlerinde O ( n   log ⁡ ( n ) ) {\displaystyle {\mathcal {O}}(n~\log(n))} {\displaystyle {\mathcal {O}}(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 yöntemi kullanarak diziyi sıralar.

Algoritma

[değiştir | kaynağı değiştir]

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) ≤ 1
        return m
    
    middle = length(m) / 2

    foreach x in m up to middle
        add x to left

    foreach 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) ≤ 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

Karmaşıklık Hesabı

[değiştir | kaynağı değiştir]

Birleştirme sıralaması böl ve yönet algoritmasına güzel bir örnektir. Algoritma her adımda diziyi ikiye bölüp en küçük birime geldiğinde bu alt dizileri sıralar ve daha sonra sıralanmış alt dizileri birleştirerek sonuca varır. Birleştirme sıralamasının karmaşıklığını hesaplamak için sıralanacak N elemanlı diziyi bir ağaç yapısına taşıyınca her bir düğüm bir alt diziyi temsil eder. Ağaç tam olarak n seviye içerir. k sayısı 0'dan n-1'e kadar ağaç seviyesini temsil etsin, yukarıdan aşağıya doğru ağacın k. seviyesinde 2 k {\textstyle 2^{k}} {\textstyle 2^{k}} tane düğüm bulunur. Bu düğümlerin her biri 2 n − k {\textstyle 2^{n-k}} {\textstyle 2^{n-k}}uzunluğunda bir alt diziyi temsil eder. Bir alt dizinin eleman sayısı 2 n − k {\textstyle 2^{n-k}} {\textstyle 2^{n-k}} olduğu için en fazla 2 n − k {\textstyle 2^{n-k}} {\textstyle 2^{n-k}} karşılaştırma yapılabilir.

Ağacın her seviyesindeki alt dizi sayısı ve yapılabilecek en fazla karşılaştırma sayısı 2 k .2 n − k = 2 n {\textstyle 2^{k}.2^{n-k}=2^{n}} {\textstyle 2^{k}.2^{n-k}=2^{n}} ' dır.

n seviye ağaç için toplam n .2 n {\textstyle n.2^{n}} {\textstyle n.2^{n}} karşılaştırma yapılır. Elde edilen   n .2 n {\textstyle n.2^{n}} {\textstyle n.2^{n}} değerinin asimptotik üst sınırı O ( N l g N ) {\displaystyle O(NlgN)} {\displaystyle O(NlgN)} değeridir.[1]

Analiz

[değiştir | kaynağı değiştir]

Birleştirme sıralaması örneğinde rastgele 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 ) {\textstyle T(N)} {\textstyle T(N)} olsun. Bu sıralama bölünen alt listelere tekrarlı olarak uygulanırsa algoritmanın tanımından T ( N ) = 2 T ( N / 2 ) + N {\textstyle T(N)=2T(N/2)+N} {\textstyle 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 l g N − 2 l g N + 1 ) {\textstyle (NlgN-2lgN+1)} {\textstyle (NlgN-2lgN+1)} olur. Bu da ( N l g N − N + 1 ) {\textstyle (NlgN-N+1)} {\textstyle (NlgN-N+1)} ile ( N l g N + N + O ( l g N ) ) {\textstyle (NlgN+N+O(lgN))} {\textstyle (NlgN+N+O(lgN))} arasındadı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. {x≈0,2645}

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 interatif 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(NlogN)'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

[değiştir | kaynağı değiştir]

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 önbellekler. Önbelleğ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.

Algoritmanın kodları

[değiştir | kaynağı değiştir]
void merge(int lower, int upper)
{
    if (lower >= upper)
        return;
    
    int lowerLimit = lower;
    int upperLimit = upper;
    int pivot = (lowerLimit + upperLimit) / 2;
    
    merge(lowerLimit, pivot);
    merge(pivot + 1, upperLimit);
    
    int endLowerLimit = pivot;
    int startUpperLimit = pivot + 1;
    
    while ((lowerLimit <= endLowerLimit) && (startUpperLimit <= upperLimit))
    {
        if (arr[lowerLimit] < arr[startUpperLimit])
        {
            lowerLimit++;
        }
        else
        {
            int t = mainForm->sort[startUpperLimit];
            for (int k = startUpperLimit - 1; k >= lowerLimit; k--)
                arr[k + 1] = arr[k];
            
            arr[lowerLimit] = t;
            lowerLimit++;
            endLowerLimit++;
            startUpperLimit++;
        }
    }
}

Kaynakça

[değiştir | kaynağı değiştir]
  1. ^ Sedgewick, Robert; Wayne, Kevin (24 Mart 2011). Algorithms (4th Edition). Addison-Wesley Professional. s. 274. ISBN 978-0321573513. 
"https://tr.wikipedia.org/w/index.php?title=Birleştirmeli_sıralama&oldid=35961476" sayfasından alınmıştır
Kategoriler:
  • Programlama
  • Sıralama algoritmaları
  • Sayfa en son 20.59, 1 Eylül 2025 tarihinde değiştirildi.
  • Metin Creative Commons Atıf-AynıLisanslaPaylaş Lisansı altındadır ve ek koşullar uygulanabilir. Bu siteyi kullanarak Kullanım Şartlarını ve Gizlilik Politikasını kabul etmiş olursunuz.
    Vikipedi® (ve Wikipedia®) kâr amacı gütmeyen kuruluş olan Wikimedia Foundation, Inc. tescilli markasıdır.
  • Gizlilik politikası
  • Vikipedi hakkında
  • Sorumluluk reddi
  • Davranış Kuralları
  • Geliştiriciler
  • İstatistikler
  • Çerez politikası
  • Mobil görünüm
  • Wikimedia Foundation
  • Powered by MediaWiki
Birleştirmeli sıralama
Konu ekle