Dizi Elemanları Arasında İşlemler
Dizi Elemanları Arasında İşlemler
Dizinin Elemanları Karşılaştırma
Dizinin kendi elemanları arasında karşılaştırma işlemi aşağıda programda gösterildiği şekilde yapılabilir.
#include <stdio.h> #define BOYUT 10 int main( ) { int a[ BOYUT ] = { 2, 6, 4, 8, 10, 12, 89, 68, 45, 37 }; int i, tur, tut; printf( "Veriler orjinal sirasinda\n" ); for ( i = 0; i <= BOYUT - 1; i++ ) printf( "%4d", a[ i ] ); for ( tur = 1; tur <= BOYUT - 1; tur++ ) /* turlar */ for ( i = 0; i <= BOYUT - 2; i++ ) /* bir tur */ if ( a[ i ] > a[ i + 1 ] ) /* bir karşılaştırma */ { tut = a[ i ]; /* bir değiştirme */ a[ i ] = a[ i + 1 ]; a[ i + 1 ] = tut; } printf( "\nVeriler artan siralamada \n" ); for ( i = 0; i <= BOYUT - 1; i++ ) printf( "%4d", a[ i ] ); printf( "\n" ); return 0; }
Karşılaş işlemi aşağıdaki komut satırı içerisinde yapılmış ve tut değişkeni içerisinde saklanmıştır.
if ( a[ i ] > a[ i + 1 ] ) { tut = a[ i ]; a[ i ] = a[ i + 1 ]; a[ i + 1 ] = tut; }
Dizi İçerisinde Arama Yapma
Programlar çoğunlukla, dizilerde tutulan büyük miktarda verilerle çalışır. Dizinin belirli elemanına erişme işlemini yapacağız.
Doğrusal Arama
#include <stdio.h> #define BOYUT 100 int lineerArama( const int [], int, int ); int main( ) { int a[ BOYUT ], x, aramaDegeri, eleman; for ( x = 0; x <= BOYUT - 1; x++ ) /* veri oluştur */ a[ x ] = 2 * x; printf( "Arama degeri tamsayisini gir:\n" ); scanf( "%d", & aramaDegeri); eleman = lineerArama( a, aramaDegeri, BOYUT); if ( eleman != -1 ) printf( "Bu deger, eleman %d de bulundu\n", eleman ); else printf( "Bu deger bulunamadi\n" ); return 0; } int lineerArama( const int dizi[], int anahtar, int boyut ) { int n; for ( n = 0; n <= boyut - 1; ++n ) if ( dizi[ n ] == anahtar ) return n; return -1; }
for ( x = 0; x <= BOYUT – 1; x++ ) a[ x ] = 2 * x;
Yukarıdaki programda a dizisinin içine 2’nin katları olan 200’e kadar sayı atanmış klavyeden 200 kadar girilen çift sayılar aşağıdaki alt program ile dizinin içerisinde aranmıştır.
int lineerArama( const int dizi[], int anahtar, int boyut ) { int n; for ( n = 0; n <= boyut – 1; ++n ) if ( dizi[ n ] == anahtar ) return n; return -1; }
Eğer aranan eleman dizinin içinde bulunursa return n ile elaman çağrıldığı yere gönderilmiştir. Eleman dizinin içerisinde yoksa return -1 değeri çağrıldığı yere yollanmıştır.
Doğrusal arama , küçük ya da sıralanmamış dizilerde iyi bir şekilde çalışır. Ancak büyük diziler için lineer arama yetersiz kalmaktadır.
İkili Arama
#include <stdio.h> #define BOYUT 15 int ikiliArama( const int [ ], int, int, int ); void baslikYazdir( void ); void satirYazdir( const int [], int, int, int ); int main( ) { int a[BOYUT], i, anahtar, sonuc; for ( i = 0; i <= BOYUT - 1; i++ ) a[ i ] = 2 * i; printf( "0 ile 28 arasinda bir sayi giriniz: " ); scanf( "%d", & anahtar ); baslikYazdir ( ); sonuc = ikiliArama ( a, anahtar, 0, BOYUT - 1 ); if (sonuc!= -1 ) printf( "\n%d, dizi elemani %d icinde bulundu\n", anahtar, sonuc); else printf( "\n%d bulunamadi\n", anahtar); return 0; } int ikiliArama ( const int b[], int aramaDegeri, int enAlt, int enUst) { int orta; while (enAlt<= enUst) { orta = ( enAlt + enUst ) / 2; satirYazdir ( b, enAlt, orta, enUst); if (aramaDegeri == b[orta] ) return orta; else if (aramaDegeri < b[orta] ) enUst = orta - 1; else enAlt = orta + 1; } return -1; /* aramaDegeri bulunamadi */ } /* Çikiş için bir başlik yazdir */ void baslikYazdir ( void ) { int i; printf( "\nBelirtecler:\n" ); for ( i = 0; i <= BOYUT - 1; i++ ) printf( "%3d ", i ); printf( "\n" ); for ( i = 1; i <= 4 * BOYUT; i++ ) printf( "-" ); printf( "\n" ); } /* Dizinin işlem yapilan kismini gösteren bir satir çikti yazdir. */ void satirYazdir ( const int b[], int enAlt, int orta, int enUst) { int i; for ( i = 0; i <= BOYUT - 1; i++ ) if ( i < enAlt || i > enUst) printf( " " ); else if ( i == orta) printf( "%3d*", b[ i ] ); /* ortadaki değeri işaretle */ else printf( "%3d ", b[ i ] ); printf( "\n" ); }
b tamsayı dizisi, bir tamsayı olan aramaDegeri, dizinin en düşük belirtecini gösteren enAlt ve dizinin en büyük belirtecini gösteren enUst olarak belirlenmiştir. Eğer arama değeri bir alt dizinin ortadaki elemanıyla eşleşmezse, enAlt ya da enUst argümanı daha küçük bir alt dizide aramanın devam edebilmesi için değiştirilir. Eğer arama değeri ortadaki elemandan küçükse, enUst belirteci orta-1 olacak biçimde değiştirilir ve arama, enAlt belirteci ile orta-1 arasındaki elemanlarda devam ettirilir. Eğer arama değeri ortadaki elemandan daha büyükse, enAlt belirteci orta+1 olacak hale getirilir ve arama, orta+1 ile enUst arasındaki elemanlarda devam ettirilir.