Ocak 1st, 2010Sıralama Algoritmaları-3
Birleşmeli Sıralama ( Merging Sort )
Birleşmeli sıralama algoritması çok iyi bir özyinemeli ( kendini tekrarlayan ) algoritmadır. Bu algoritmada dizi iki tane alt kümeye ayrılır. Sonra bu alt kümeler kendi aralarında tekrar ikiye bölünür ta ki alt kümelerden herhangi birisinin eleman sayısı bir olanak dek. Bundan sonra birleştirme işlemi yapılmaya başlanır birleştirilirken elemanlar sıraya sokularak geldiği fonksiyona sıralanmış bir şekilde geri döner.

Yukarıdaki resme dikkatle bakarsanız algoritmanın çalışma şeklini daha iyi anlayabilirsiniz. Kısaca özetlersek dizi önce ikiye bölünüyor sonra tekrar ikiye bölünüyor en sağ taraftaki alt kümelerden birinin eleman sayısı bir oluyor. ( 9,82 ile 10 > 9,82 ve 10 şeklinde ikiye parlanmış ve bir alt küme olan 10 sayısı tek elemana düşünce algoritma gereği parçalara ayrılan dizi sıralanarak tekrar birleştiriliyor.. )
Uygulama:
using System; public class birlestirmeliSıralama { int[] dizi={30,8,89,3,49,67,11,9,86,27}; //Sıralanacak dizimiz // Bölünmüş diziler burda sıralanıyor public void diziyiSırala( int sol , int sag ) { if ( ( sag - sol ) >= 1 ) // Eğer sağ taraf sol taraftan büyükse { int ortaDizi = ( sol + sag ) / 2; // diziyi ikiye böl int ortaDizi2 = ortaDizi + 1; // artan elemanı ikinci diziye ekle // bu fonksiyon özyinemeli diziyiSırala( sol, ortaDizi ); // ilk dizi diziyiSırala( ortaDizi2, sag ); // ikinci dizi //parçalan iki diziyi sırala mergeSort( sol, ortaDizi, ortaDizi2, sag ); } } //End diziyiSırala // Ana algoritma burda başlıyor bölme ve birleştirme işlemleri public void mergeSort( int sol, int ortaDizi, int ortaDizi2, int sag ) { int solIndeks = sol; // parçalanmış dizi sol taraf int sagIndeks = ortaDizi2; // parçalanmış dizi sağ taraf //dizi işlemlerini boş bir dizide yapıp sonra ana diziye kopyalıcaz int calisilanIndeks = sol; //boş dizinin indeksi int[] calisilan = new int[ dizi.Length ];//boş dizi oluşturuluyor // diziler kendi içlerinde bölünüyor while ( solIndeks <= ortaDizi && sagIndeks <= sag ) { //diziler içindeki elemanlar karşılaştırılıyor if ( dizi[ solIndeks ] <= dizi[ sagIndeks ] ) calisilan[ calisilanIndeks++ ] = dizi[ solIndeks++ ]; else calisilan[ calisilanIndeks++ ] = dizi[ sagIndeks++ ]; } // Bölme işlemi sonunda eğer soldaki dizi boşaldıysa if ( solIndeks == ortaDizi2 ) // sağdaki diziyi calisilan dizisine kopyala while ( sagIndeks <= sag ) calisilan[ calisilanIndeks++ ] = dizi[ sagIndeks++ ]; else //Sağdaki dizi boşaldıysa // soldaki diziyi calisilan dizisine kopyala while ( solIndeks <= ortaDizi ) calisilan[ calisilanIndeks++ ] = dizi[ solIndeks++ ]; // Yukarda yapılan işlem algoritmanın son birleştirme işlemini göstermektedir for ( int i = sol; i <= sag; i++ ) { // birleştirilen dizi ana diziye kopyalanır dizi[ i ] = calisilan[ i ]; } } // End Merge //--------------------------------------------------------------------------------------------- public void yazdir() { foreach (int sayılar in dizi) { Console.Write(sayılar+" "); } Console.WriteLine("\n"); } } //End birlestirmeliSıralama Class public class birlestirmeliSıralamaTest { public static void Main( string[] args ) { birlestirmeliSıralama dizi= new birlestirmeliSıralama(); Console.Write( " Sıralanmamış dizi: "); dizi.yazdir(); dizi.diziyiSırala( 0, 9 );//10 elemanlı dizimiz olduğu için (0-9) Console.Write( " Sıralanmış dizi: "); dizi.yazdir(); } // End Main } //-- End mergeTest
Ekran Çıktısı :
