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.

merge sort

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ı :

outputMerge

Kaynak Kod ve Makale’i indirmek için tıklayınız …