Bir algoritmayı koda dökmenin en güzel yöntemi, öğrendiğiniz adımları kendinizin kod olarak yazmaya çalışmanızdır. Kod çalışmazsa çalışmasın, sorun değil. Emin olun ki siz yazmaya çalışırken bir şeyler öğreneceksiniz. Daha sonra doğrusuna bakar hatalarınızı düzeltirsiniz. Şimdi kendimiz yazmaya çalışalım.
Elimizdeki en temel bilgi şu. Bu algoritmada bize minimum değeri lazım. Yani bu değeri her zaman elimizde tutmamız gerekir. Daha sonra bu değer ekseninde işlemlerimizi gerçekleştireceğiz.
Peki hangi işlemleri gerçekleştireceğiz? tabii ki swap işlemi. Selection Sort algoritmasının gereği olarak dizideki tüm elemanları tarayacağız, en küçüğü bulduğumuz zaman swap yapacağız. Tüm elemanları taramak falan belli ki for döngüsü işi. Biraz netleştirmek için bir for döngüsü patlatalım. Peki ama for döngüsü kaç kere dönecek? cevabı çok net, biz adım adım algoritmamızın işleyişini yazarken toplamda 5 iterasyon gerçekleştirmiştik. 6 neydi? eleman sayımız, yani eleman sayımızdan 1 eksiği kadar döngümüzün dönmesi gerekiyor.
for(int i=0; i<n-1; i++)
{}
çok harika bir başlangıç yaptık :)) tüm elemanları böylece tarayacağız. Aman dikkat, n demedik, n-1 dedik. Neden? çünkü adım adım yaparken gördük, n elemanımız varsa n-1 işlem yapıyoruz. Yani daha fazla yapabilmek mümkün değil!
e peki bir şeyi daha biliyoruz; o da minimum değeri. Bakın minimum değerini i değerine eşitlemek gayet güzel bir fikir. Çünkü her döngüde 1 artacak. Selection Sort Algoritması uygulaması doğrultusunda gördüğümüz üzere ilk olarak minimum değeri belirliyoruz, daha sonra o adım içerisinde başka işlemler gerçekleştiriyoruz. Yani bizim yine for döngüsüne ihtiyacımız olacak. Ancak minimum değeri üstteki for döngüsünde olmalı. Bakın bunu şu şekilde yazıyorum
for(int i=0; i<n-1; i++)
{
int min=i;
for( j = i+1; j<n; j++)
{
}
}
bakın burada dikkat edilmesi gereken nokta int min ifadesinin içteki for döngüsünün dışında olması. Biz her geçişte minimum değerini bir artırıyoruz, ancak minimum değerini artırdıktan sonra bir geçiş içerisinde en küçük elemanı bulmak için bir başka for döngüsü daha oluşturuyoruz. Oluşturduğumuz for döngüsünün en ilginç kısmı j=0 değilde j = i+1 olması. Neden? Çünkü biz j'yi eğer sıfırdan başlatırsak zaten sıraladığımız değerler için döngüyü boşuna döndürmüş oluruz. Örnekten de hatırlayacağınız üzere, kırmızı şekilde işaretlediğimiz sayılar zaten sıralıydı. Onları değerlendirmeye almıyorduk. İşte biz de j=i+1 diyerek değerlendirmeye almamış oluyoruz.
Şimdi gelelim koşulumuza. Koşulumuz neydi? Tüm elemanları tarıyor, dizideki en küçük değeri buluyoruz ve o değeri dizimizin minimum indisine atıyoruz. şimdi bu işlemi yapalım
for(int i=0; i<n-1; i++)
{
int min=i;
for( j = i+1; j<n; j++)
{
if(dizi[j] < dizi[min])
min = j;
}
}
Kırmızıyla yazdığım ifadeye bakın. Eğer dizi[j] dizi[min]'den küçükse, min değişkenine, j değerini atıyorum. Bu içteki for döngüsü en küçük elemanı buluyor.
Peki, en küçük elemanı bulduktan sonra ne yapıyorduk? Tabii ki swap işlemini yapıyorduk. Ama nerede yapacağız? İçteki döngüde ami yoksa dıştakinde mi? Bunun cevabını bulmak için ezberci olmaya gerek yok. Swap işlemi adımların sonucunda gerçekleşir. Yani adımlar içerisinde en küçük eleman bulunacak ki, swap gerçekleşecek. zırt pırt swap yapmıyoruz yani. Sonuç kesinleşsin ondan sonra. Bu da swap işlemi dışarıdaki döngüde gerçekleşecek demektir.
for(int i=0; i<n-1; i++)
{
int min=i;
for( j = i+1; j<n; j++)
{
if(dizi[j] < dizi[min])
min = j;
}
int temp = dizi[i];
dizi[i] = dizi[min];
dizi[min] = temp;
}
Kırmızıyla yazdığım kodlar tamamen swap kodlarıdır. Swap nedir diye soruyorsanız linke tıklayarak cevabı öğrenebilirsiniz.
Bu yazdığım kod, algoritmanın nasıl c koduna döküleceğine dair yaklaşımı içerir. Direkt olarak çalışmaz, zaten neyi çalışacak ki :) ? bu kod çekirdek koddur, algoritmayı içerir. Hazır kod istiyorsanız Selection Sort C Kodu Uygulaması konusuna bakmanız gerekmektedir.Etiketler: selection sort, selection sort c kodu, selection sort kodu, selection sort nasıl yazılır, sıralama algoritmaları