17 Temmuz 2009 Cuma

C Dizilerde Arama & Sıralama

DİZİ İÇERİSİNDE ELEMAN ARAMA: Herhangibir elemanın dizi içerisinde olup olmadığına bakılabilir. Bunun için kullanılacak en basit yöntem, dizi elemanlarının aranılan elemana eşit olup olmadığına sıra ile bakmaktır. Sonuna kadar bakılıp hiçbirine eşit bulunamadı ise o eleman dizide yok demektir.

DİZİ ELEMANLARINI SIRALAMA: Dizideki elemanları büyükten küçüğe ya da küçükten büyüğe sıralamak için farklı mantıklar kullanılabilir. Sıralama çoğunlukla iki yöntem kullanılır.

Seçme Sıralaması (Selection Sort) : Dizinin ilk elemanı kendinden sonraki elemanların hepsi ile tek tek karşılaştırılır. Her karşılaştırma işleminden sonra eğer elemanlar ters sırada ise (küçükten büyüğe sıralamada üstteki eleman büyükse) bu iki eleman yer değiştirilir. İlk eleman sonuna kadar her elemanla karşılaştırılıp gerekli olanlar yer değiştirdikten sonra dizinin ilk elemanı (küçükten büyüğe sıralanıyorsa dizinin en küçük elemanı, büyükten küçüğe sıralanıyorsa dizinin en büyük elemanı) bulunup yerine yerleştirilmiş olur. Bundan sonra aynı işlem dizinin diğer elemanlarına da tek tek uygulanır. Bunları örnek bir dizi üzerinde görürsek daha iyi anlayacağız.

İlk eleman için:

9 3 6 1 12

9>3 mü? Evetse ters sıradalar. 9 ve 3’ü yer değiştir. Hayırsa hiç birşey yapma. devam Arık 3 ilk eleman oldu. Karşılaştırma sıradaki elemandan devam ediyor.


3 9 6 1 12

3>6 mı? Hayır. Karşılaştırma sıradaki elemandan devam ediyor.


3 9 6 1 12

3>1 mi? Evet. Bu iki elemanı yer değiştir. Artık ilk eleman 1 oldu. Karşılaştırma sıradaki elemandan devam ediyor.


1 9 6 3 12

1>12 mi? Hayır.

İlk eleman sonuna kadar her elemanla karşılaştırıldı. Ters sırada olanlar yer değiştirildi. Böylece ilk geçişte en küçük eleman bulundu ve ilk sıraya yerleşti. Aynı karşılaştırılma işlemi 2. eleman için tekrarlanacak: (İlk eleman zaten doğru sırasına yerleştiğine göre karşılaştırmaya en baştan başlamaya gerek yok. Kendinden bir sonraki elemandan başlanabilir.)



1 9 6 3 12

9>6 mı? Evet. Bu iki elemanı yer değiştir. Artık ikinci eleman 6 oldu. Karşılaştırma sıradaki elemandan devam ediyor.


1 6 9 3 12

6>3 mü? Evet. Bu iki elemanı yer değiştir. Artık ikinci eleman 3 oldu. Karşılaştırma sıradaki elemandan devam ediyor.


1 3 9 6 12


3>12 mi? Hayır.

İkinci eleman da sonuna kadar her elemanla karşılaştırıldığında ve gerekli değiştirme işlemleri yapıldığında ikinci sırada yeralması gereken eleman da yerine yerleşmiş oluyor. Ancak sonraki elemanlar hala karışık. Aynı işlemi onlara da uygulayalım. Şimdi sıra 3. elemanda


1 3 9 6 12

9>6 mı? Evet. Bu iki elemanı yer değiştir. Artık üçüncü eleman 6 oldu. Karşılaştırma sıradaki elemandan devam ediyor.


1 3 6 9 12

6>12 mi? Hayır.

Karşılaştırma 4. eleman için devam ediyor:


1 3 6 9 12

9>12 mi? Hayır.

Bu sıralama algoritmasını C koduna dökmek için elbetteki içiiçe iki döngü kullanılmalıdır. Ancak iki elemanın yerini değiştirirken 3. bir yedek değişken kullanmaya dikkat edilmelidir. Aksi taktirde iki elemanın yerini değiştirmek için,
a = b;
b = a; gibi iki komut kullanmak son derece yanlış bir sonuç doğurur. Bu iki komut sonunda her iki sayıda ikinci sayı ile (b değişkeni) aynı olur.

Halbuki yer değiştirme işlemi için kullanılacak yedek bir değişkenle aşağıdaki gibi yapılır.

yedek = a;
a = b;
b = yedek;

Şimdi bu mantığı kullanarak örnek bir dizi sıralaması yapalım:

/* Seçme Sıralaması yöntemi dizi sıralama */
#include
#include
#define BOYUT 5;
void main()
{
int a[5] = {9,3,6,1,12};
int i, j,yedek;
for (i=0 ; ia[j] )
{
yedek= a[i];
a[i] = a[j];
a[j] = yedek;
}
printf (“\n Dizi sıralandı:”);
for ( i=0; i3 mü? Evetse ters sıradalar. 9 ve 3’ü yer değiştir. Karşılaştırma sıradaki elemandan devam ediyor.


3 9 6 1 12

9>6 mı? Evet. Bu iki elemanı yer değiştir. Karşılaştırma sıradaki elemandan devam ediyor.


3 6 9 1 12

9>1 mi? Evet. Bu iki elemanı yer değiştir. Karşılaştırma sıradaki elemandan devam ediyor.


3 6 1 9 12

9>12 mi? Hayır.

İlk tur karşılaştırma bitti. Ters sırada olanlar yer değiştirildi. Böylece ilk geçişte en büyük eleman bulundu ve ilk sıraya yerleşti. Aynı karşılaştırılma işlemi ilk elemandan başlanıp tekrarlanacak. Dizideki eleman sayısınca aynı işlem yapıldığında dizi sıralanmış olacak. Bu sıralama algoritmasının kodunu sanırım kendiniz düzenleyebilirsiniz. Lütfen deneyiniz!...

Hiç yorum yok:

Yorum Gönder