Quick Sort ( Hızlı Sıralama)

Merhaba millet. Bu yazımızda QuickSort ( Hızlı sıralama ) algoritmasını görücez. Bu algoritmanın en önemli özelliği özyinemeli olmasıdır. Sıralanmış bir dizide (küçükten-büyüğe) dizinin ortasındaki ( herhangi bir elemanda olabilir ) eleman sol’undaki sayılardan büyük sağındaki sayılardan küçüktür. Bu tespitten yola çıkılarak seçilen elemen dizinin sıralanmış halindeki konumuna yerleştirilir. Daha sonra solundaki kısım ile sağındaki kısım olarak dizi bu değere göre iki parçaya ayrılır. Aynı işlem sağ ve sol dizilere de uygulanır. Bu şekilde tüm parçalar bir alt parça kalmayana dek hem parçalanır hem de sıralanır. Gördüğünüz gibi parçalama işlemi burada özyinemeli olarak yapılmaktadır. Aşağıdaki resme bakarsanız yapılan işlemi daha rahat anlayacağınıza eminim.

QuickSort

Şekil: Hızlı Sıralama Algoritması

Şimdi  nasıl kod ortamına dökücez onu görelim.

using System;
 
 
 
class demoQuickSort
{
  public static void Main()
  {
    int[] dizi = {
      1, 9, 0, 5, 6, 7, 8, 2, 4, 3};
 
 
    diziYazdir(dizi, "Sıralanmadan Önce Dizi :");
    //Sıralama işlemi başlasın :)
    QuickSort(dizi,0,dizi.Length-1);
    diziYazdir(dizi, "Sıralandıktan Sonra Dizi :");
 
 
  }
 
 
  private static void QuickSort(int[] dizi, int sol, int sag)
  {
    int solIndeks, sagIndeks;
    int pivot, gecici;
 
    solIndeks = sol; sagIndeks = sag;
    //dizinin ortasından pivot değerini seçelim
    pivot = dizi[(sol + sag) / 2];
 
    do
    {
      while ((dizi[solIndeks] < pivot) && (solIndeks < sag)) solIndeks++;
      while ((pivot < dizi[sagIndeks]) && (sagIndeks > sol)) sagIndeks--;
      //İndeks değerleri eşitlene kadar ya da sagIndeks 
      //büyük olana kadar dizi parçalanır
      //aslında burda yapılan işlem seçmeli sıralamanın başka bir türü
      //yukardaki while döngüleri ile dizi elemanları karşılaştırılıyor
 
      if (solIndeks <= sagIndeks)
      {
        gecici = dizi[solIndeks];
        dizi[solIndeks] = dizi[sagIndeks];
        dizi[sagIndeks] = gecici;
        solIndeks++; sagIndeks--;
      }
    } while (solIndeks <= sagIndeks);
    //burdaki if döngüleri ile dizi en alt kümeye kadar sıralanıyor..
    if (sol < sagIndeks) QuickSort(dizi, sol, sagIndeks);//dizinin sol tarafı sıralanıyor
    if (solIndeks < sag) QuickSort(dizi, solIndeks, sag);//dizinin sağ tarafı sıralanıyor
  }
  //diziyi ekrana yazdırmak için gerekli metot
  public static void diziYazdir(int[] dizi, string metin)
  {
    Console.Write(metin);
    foreach (int yaz in dizi)
    {
      Console.Write(" " + yaz + ",");
    }
    Console.WriteLine("\n");
  }
}

Kaynak kod ve makaleyi indirmek için Tıklayınız