algoritma

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.

Selection Sort (Seçmeli Sıralama) Algoritması

Selamün Aleyküm Arkadaşlar;

Seçme sıralama algoritması ilk sayının seçilip sonra diğer sayılarla karşılaştırılmasıdır. Sonra ikinci sayı, üçüncü sayı seçilip devam eder.

78, 321, 12, 9, 45 sayılarını büyükten küçüğe doğru seçmeli sıralama algoritmasıyla sıralayalım.

İlk önce 1. sayı (78) seçilir. Sonra diğer sayılarla karşılaştırılarak içlerinde en büyük sayı (321) bulunur ve seçilen sayı (78) yer değiştirir. (321, 78, 12, 9, 45)

Sonra ikinci sayı (78) seçilir sonraki diğer sayılarla karşılaştırılır ve içlerinden en büyük sayı (78) ile yer değiştirir. (321, 78, 12, 9, 45)

Sonra üçüncü sayı (12) seçilir sonraki diğer sayılarla karşılaştırılır ve içlerinden en büyük sayı (45) ile yer değiştirir. (321, 78, 45, 9, 12)

Sonra dördüncü sayı (9) seçilir sonraki diğer sayılarla karşılaştırılır ve içlerinden en büyük sayı (12) ile yer değiştirir.

321, 78, 45, 12, 9

Böylelikle büyükten küçüğe sıralama işlemi tamamlanmış olur.

Burada dikkat edilirse iki döngü bulunmaktadır. Biri sayı seçip diğeri en büyük sayıyı bulmaktadır. Seçilen sayının döngüsü sayının uzunluğu – 1 kadar gitmektedir. Yani 5 sayıdan 4’ü seçilmektedir. En büyük sayının bulunması döngüsü ise seçilen sayının indeksi + 1 ve sayının uzunluğuna kadar gitmektedir.

İlk önce sayılarımızı bir dizide tanımlayalım.

int[] dizi = new int[]{78, 321, 12, 9, 45};

Şimdi seçme işlemi için döngümüzü uzunluk – 1’e kadar yazalım.

int[] dizi = new int[]{78, 321, 12, 9, 45};

for(int i = 0; i < dizi.Length - 1; i++){
//Sayı seçme döngüsü
}

İkinci for işleminde seçilen sayı sonraki sayılarla karşılaştırılır ve en büyük sayı bulunur. Burada dikkat etmemiz gereken nokta en büyük sayı ile seçilen sayının yer değiştirmesi olayıdır. Bunun için bulunan en büyük sayının nerede olduğunu bilmemiz gerekir. Bunun için en büyük sayının bulunduğu index numarasını almalıyız. Sonrada seçilen sayı ile bulunan en büyük sayı yer değiştirir.

int[] dizi = new int[]{78, 321, 12, 9, 45};

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

	int temp = dizi[i];
	dizi[i] = dizi[enbuyukindex];
	dizi[enbuyukindex] = temp;
}

Proje dosyasını 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.

Insertion Sort (Eklemeli Sıralama) Algoritması

Selamün Aleyküm Arkadaşlar;

Eklemeli sıralama algoritmasının nasıl olduğuna örnek vermek gerekirse:

Elimizde 6 tane sayı olsun. Bunlar 156, 34, 53, 6, 1, 10 olsun. Bunları küçükten büyüğe doğru sıralayalım.

İlk önce ikinci sayı alınıp bir önceki sayıyla (156) karşılaştırılır. Eğer ikinci sayı (34) birinci sayıdan küçükse yerleri değiştirilir.

Şuan sayı sıramız şu şekilde oldu. (34, 156, 53, 6, 1, 10)

Sonra üçüncü sayı (53) bir önceki sayılarla (34, 156) karşılaştırılır. Hangi sayıdan küçükse o sayıyla yer değiştirir. (34, 53, 156, 6, 1, 10)

Sonra dördüncü sayı (6) diğer önceki sayılarla (34, 53, 156) karşılaştırılır hangisinden küçükse onunla yer değiştirir. (6, 34, 53, 156, 1, 10)

Sonra beşinci sayı (1) diğer önceki sayılarla (6, 34, 53, 156) karşılaştırılır hangisinden küçükse onunla yer değiştirir. (1, 6, 34, 53, 156, 10)

Sonra son sayı (10) diğer önceki sayılarla (1, 6, 34, 53, 156) karşılaştırılır hangisinden küçükse onunla yer değiştirir. Ve sıralama işlemi tamamlanır.

1, 6, 10, 34, 53, 156

Bu işlemde iki döngünün yer aldığını görmekteyiz. Birinci döngü sayıyı seçiyor. İkinci döngü ise bir önceki sayılar etrafında dönüyor ve seçilen sayı diğer önceki sayılarla karşılaştırılıyor.

Bir dizimizde bu sayıları tutalım.

int[] dizi = new int[]{156, 34, 53, 6, 1, 10};

Bu sayıları teker teker seçmek için bir döngüye ihtiyacımız var. Bu döngü index 0 dan o dizinin uzunluğuna kadar dönmelidir.

int[] dizi = new int[]{156, 34, 53, 6, 1, 10};

for (i = 0; i < dizi.Length; i++){
//diziden sırasıyla eleman seçme
}

Şimdi ise seçtiğimiz elemandan bir önceki elemanları karşılaştırmamız için bir döngü yazmalıyız. Bu döngü seçtiğimiz elemandan geriye doğru gitmeli. Index numarası seçtiğimiz elemanın indeksine eşit olarak başlamalı ve index numarası 0’den büyük olduğu sürece devam etmelidir. Çünkü bir önceki elemanın indeksi -1 olamaz.

int[] dizi = new int[]{156, 34, 53, 6, 1, 10};

for (i = 0; i < dizi.Length; i++){
	for(j = i; j > 0; j--){
		//Seçilen elemanın önceki elemanlarla karşılaştırılması
	}
}

dizi[j] ile elemanımızı seçip dizi[j – 1] ile bir önceki elemanla karşılaştırabiliriz. Küçükten büyüğe doğru sıraladığımız için dizi[j] < dizi[j – 1] olmalıdır. Eğer bu şartı sağlarsa elemanların değerlerini değiştirmeliyiz. Bunun için diğer elemandaki veriyi bir değişkende tutup değiştirmeliyiz.

int[] dizi = new int[]{156, 34, 53, 6, 1, 10};

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

Proje dosyasını 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.