Coctail Sort (Kokteyl Sıralama) Algoritması

Selamün Aleyküm Arkadaşlar;

Kokteyl sıralama algoritması bir elemanı seçip sonraki diğeriyle karşılaştırıp, koşul sağlanırsa yer değiştirip; son elemana kadar bu şekilde devam eder. Son elemanı karşılaştırdıktan sonra eğer bu döngüde yer değiştirme olmuşsa bu sefer sondan başlayarak karşılaştırır.

5, 10, 1, 2, 47 sayıları olsun. Küçükten büyüğe doğru kokteyl sıralama algoritmasıyla sıralayalım.

ilk önce ilk eleman (5) seçilir. Sonraki elemanla (10) karşılaştırılır. Sonraki eleman ilk elemandan küçükse yer değiştirir. Burada 10, 5’den küçük olmadığı için aynen kalır. (5, 10, 1, 2, 47)

Sonra ikinci eleman (10) seçilir. İkinci eleman sonraki elemanla (1) karşılaştırılır. İkinci elemandan küçükse yer değiştirir. Burada 1, 10’dan küçük olduğu için yer değiştirir. (5, 1, 10, 2, 47)

Sonra üçüncü eleman (10) seçilir. Üçüncü elemandan sonraki elamanla (2) karşılaştırılır. (5, 1, 10, 2, 47)

Sonra dördüncü eleman (2) seçilir. Dördüncü elemandan sonraki elamanla (47) karşılaştırılır. (5, 1, 10, 2, 47)

Döngü biter. Eğer yer değiştirme olmuşsa bu sefer sondan (47) başlayarak bir önceki eleman (2) karşılaştırılır. (5, 1, 10, 2, 47)

Sonra sondan ikinci eleman (2) seçilir. Önceki elemanla (10) karşılaştırılır. (5, 1, 10, 2, 47)

Sonra sondan üçüncü eleman (10) seçilir. Önceki elemanla (1) karşılaştırılır. (5, 1, 10, 2, 47)

Sonra sondan dördüncü eleman (1) seçilir. Önceki elemanla (5) karşılaştırılır.  Önceki eleman küçük olduğu için yer değiştirir. (1, 5, 10, 2, 47)

Sonra tekrar baştan itibaren bir daha bir sonraki elemanlar karşılaştırılır. (1, 5, 2, 10, 47)

Eğer yer değiştirme olmuşsa bu sefer tekrar sondan itibaren eleman seçilerek bir önceki elemanla karşılaştırılır. (1, 2, 5, 10, 47)

Sonra tekrar baştan itibaren bir sonraki eleman karşılaştırılır. Yer değiştirme olmadığı için sayılarımız sıralanmıştır. Döngüden çıkılır.

Burada iki döngü olduğunu görmekteyiz. Birincisi baştan başlayarak sonraki elemanı karşılaştırıyor. İkincisi sondan başlayarak bir önceki elemanı karşılaştırıyor. Birinci döngüde eğer yer değiştirme olmuşsa ikinci döngüye devam ediyor. Bu yüzden bir kontrol yapmamız gerekir.

İlk döngümüzü yazalım. Baştan başlayarak sondan bir eksiğine kadar gidecek ve seçilen elemanla bir sonraki elemanı karşılaştırılacak. Sonra büyüklük veya küçüklük sıralamasına göre yer değiştirecek.

int[] dizi = new int[]{5, 10, 1, 2, 47};

for (int i = 0; i < dizi.Length - 1; i++)
   {
        if (dizi[i + 1] < dizi[i])
        {
            int temp = dizi[i];
            dizi[i] = dizi[i + 1];
            dizi[i + 1] = temp;
        }
}

İkinci döngümüzüde yazalım. Sondan başlayarak index 1’e kadar gidecek. Bir önceki elemanı karşılaştıracak.

int[] dizi = new int[]{5, 10, 1, 2, 47};

//Birinci Döngü
for (int i = 0; i < dizi.Length - 1; i++)
   {
        if (dizi[i + 1] < dizi[i])
        {
            int temp = dizi[i];
            dizi[i] = dizi[i + 1];
            dizi[i + 1] = temp;
        }
}

//İkinci Döngü
for (int i = dizi.Length - 1; i > 0; i--)
{
    if (dizi[i] < dizi[i - 1]) {
        int temp = dizi[i];
        dizi[i] = dizi[i - 1];
        dizi[i - 1] = temp;
    }
}

Bunun dışında yer değiştirme olmadığı sürece dönen bir koşullu döngü vardır. Biz bunu sonsuz döngü şeklinde yazıp yer değiştirme olmadığı zaman döngüden çıkma işlemini yapalım. Yer değiştirmeyi bilmek için ilk döngüde şart sağlandığı zaman yer değiştirme olmaktadır. Bir bool değişken tanımlayıp o koşulun içinde true yapalım. Dışarıdaki koşullu döngüde, başlangıçta bu kontrolün false olması gerekir. Birinci döngü bittikten sonra eğer yer değiştirme olmadıysa veri sıralanmıştır. Bu yüzden sonsuz döngüden çıkalım.

int[] dizi = new int[]{5, 10, 1, 2, 47};

while (true) {
    bool degisti = false;

    //Birinci Döngü - Baştan Sona
    for (int i = 0; i < dizi.Length - 1; i++)
       {
            if (dizi[i + 1] < dizi[i])
            {
                int temp = dizi[i];
                dizi[i] = dizi[i + 1];
                dizi[i + 1] = temp;
                degisti = true;
            }
    }

    if (!degisti)
        break;

    //İkinci Döngü - Sondan Başa
    for (int i = dizi.Length - 1; i > 0; i--)
    {
        if (dizi[i] < dizi[i - 1]) {
            int temp = dizi[i];
            dizi[i] = dizi[i - 1];
            dizi[i - 1] = temp;
        }
    }
}

Projeyi buradan indirebilirsiniz.

 

Hayırlı günler, sağlıcakla kalın.

Bu döküman www.ibasoglu.com’a aittir. Kaynak belirtmek suretiyle alıntı yapılabilir.