08.11.2014 Views

c_kitap

c_kitap

c_kitap

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

C ve Sistem Programcıları Derneği - C Ders Notları - Necati Ergin<br />

Yukarıdaki main işlevinde sıralı bir dizinin içinde arama yapmak amacıyla binary search<br />

isimli algoritma kullanılıyor. Dizi sıralanmış olduğuna göre, dizinin ortadaki elemanına<br />

bakılmasıyla, dizideki elemanların yarısı artık sorgulama dışı bırakılır, değil mi?<br />

low değişkeni arama yapılacak dizi parçasının en düşük indisini, high değişkeni ise en<br />

büyük indisini tutuyor. Daha sonra low değeri, high değerinden küçük ya da eşit olduğu<br />

sürece dönen bir while döngüsü oluşturulduğunu görüyorsunuz. mid değişkeni arama<br />

yapılacak dizi parçasının ortadaki elemanının indisini tutuyor. Dizinin mid indisli<br />

elemanının aranan değer olup olmadığına bakılıyor. Aranan değer bulunamamışsa iki<br />

olasılık vardır: mid indisli dizi elemanı aranan değerden büyük ise high değişkeninin<br />

değeri mid - 1 yapılıyor. Böylece arama yapılacak dizi boyutu yarıya düşürülüyor. mid<br />

indisli dizi elemanı aranan değerden küçük ise low değişkeninin değeri mid + 1 yapılıyor.<br />

Böylece yine arama yapılacak dizi boyutu yarıya düşürülüyor.<br />

while döngüsü çıkışında eğer low değeri high değerinden büyükse aranan değer<br />

bulunamamış demektir. Aksi halde dizinin mid indisli elemanı aranan değerdir.<br />

Dizilerin Sıralanması<br />

Dizinin elemanlarını küçükten büyüğe ya da büyükten küçüğe sıralamak için farklı<br />

algoritmalar kullanılabilir. Aşağıda, algısal karmaşıklığı çok yüksek olmayan "kabarcık<br />

sıralaması" (bubble sort) isimli algoritma ile bir dizi sıralanıyor:<br />

#include <br />

#defineSIZE 10<br />

int main()<br />

{<br />

int a[SIZE] = {2, 3, 1, 7, 9, 12, 4, 8, 19, 10};<br />

int i, k, temp;<br />

for (i = 0; i < SIZE - 1; ++i)<br />

for (k = 0; k < SIZE -1 - i; ++k)<br />

if (a[k] > a[k + 1]) {<br />

temp = a[k];<br />

a[k] = a[k + 1];<br />

a[k + 1] = temp;<br />

}<br />

for (k = 0; k < SIZE; ++k)<br />

printf("%d ", a[k]);<br />

}<br />

return 0;<br />

Aynı algoritma bir do while döngüsü kullanılarak da kodlanabilirdi:<br />

#include <br />

#define SIZE 10<br />

#define UNSORTED 0<br />

#define SORTED 1<br />

int main()<br />

{<br />

int a[SIZE] = {12, 25, -34, 45, -23, 29, 12, 90, 1, 20};<br />

int i, k, temp, flag;<br />

do {<br />

flag = SORTED;<br />

for (k = 0; k < SIZE - 1; ++k)<br />

if (a[k] > a[k + 1]) {<br />

208

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!