Quicksort Algoritması

Eyl 08, 2013

Quiksort günümüzde yaygın olarak kullanılan bir sıralama algoritmasıdır. Quicksort algoritması, sıralanacak bir diziyi daha küçük iki parçaya ayırıp oluşan bu küçük parçaların kendi içinde sıralanması mantığıyla çalışır.

Algoritmanın Çalışması

Algoritma adımları şu şekilde özetlenebilir:

  1. Diziden herhangi bir elemanı pivot(kilit) eleman olarak seçer.
  2. Diziyi, pivot elemandan küçük olan bütün elemanlar pivot elemanın önüne, pivot elemandan büyük olan bütün elemanlar pivot elemanın arkasına gelecek biçimde düzenler. Pivot elemana eşit olan sayılar sıralamanın küçükten büyüğe ya da büyükten küçüğe olmasına bağlı olarak pivot elemanın her iki tarafına da geçebilir.
  3. Quicksort algoritması özyineli(recursive) çağrılarak, oluşan küçük diziler tekrar sıralanır.
  4. Algoritma eleman sayısı sıfır olan bir alt diziye ulaşana kadar bu işlem devam eder.
  5. Eleman sayısı sıfır olan bir alt diziye ulaşıldığında algoritma bu dizinin sıralanmış olduğunu varsayar ve sıralama işlemi tamamlanmış olur.

Algoritmanın C# Programlama Diliyle Gerçeklenmesi

Aşağıdaki Main fonksiyonda double veri tipinden bir dizi tanımlanmış olup, dizinin eleman sayısı kullanıcıdan istenmiştir. Dizinin elemanları ise 0 ile 100 arasında olacak şekilde rastgele olarak oluşturulur.

QuickSort ve Partition fonksiyonları algoritmayı oluşturan fonksiyonlardır.

static void Main(string[] args)

    Console.Write("Lütfen dizinin eleman sayısını giriniz: ");
    int eleman_sayısı = int.Parse(Console.ReadLine());
    double[] dizi = new double[eleman_sayısı];
    Random rand = new Random();

    for (int i = 0; i < eleman_sayısı; i++)
    { 
       dizi[i] = rand.Next() % 100;
    }

    Console.WriteLine("\nDizi\n");

    for (int i = 0; i < eleman_sayısı; i++)
    {
       Console.Write(dizi[i]);
       Console.Write(" "); 
    }

    Console.WriteLine("\n\nQuickSort\n");

    QuickSort(dizi, 0, eleman_sayısı - 1);

    for (int i = 0; i < eleman_sayısı; i++)
    {
       Console.Write(dizi[i]);
       Console.Write(" ");
    }

    Console.Read();
}

public static void QuickSort(double[] A, int p, int r)
{
    if (p < r)
    {
        int q = Partition(A, p, r);
       QuickSort(A, p, q - 1);
       QuickSort(A, q + 1, r);
    }
}

public static int Partition(double[] A, int p, int r)
{
    double x = A[r];
    int i = p - 1;

    for (int j = p; j <= r - 1; j++)
    {
        if (A[j] <= x)
        {
           i = i + 1;
           double temp1 = A[i];
           A[i] = A[j];
           A[j] = temp1;
        }
    }

    double temp2 = A[i + 1];
    A[i + 1] = A[r];
    A[r] = temp2;
    return i + 1;
}

Bu uygulamanın çıktısı aşağıdaki gibi olacaktır: