Arama Algoritmaları Doğrusal Arama ve Binary Arama Doğrusal Arama - Örnek • Dizi (Array) sayilistesi içerisindeki sayılar aşağıdaki gibidir: 17 23 5 11 2 29 3 • 11, verilen dizi içerisinde aranacaksa doğrusal arama algoritması 17, 23, 5, ve 11 sayılarını test eder. • 7, aranacak ise 17, 23, 5, 11, 2, 29, ve 3 sırası ile test edilir (ve aranan sayı bulunamaz!. ) Doğrusal Arama Algoritması • Algoritma: bulundu değişkenini yanlış olarak atayınız; pozisyon değişkenini –1 olarak atayınız; index değişkenini 0 olarak atayınız. wwhhiillee ((iinnddeexx << ddiizziiddeekkii eelleemmaann ssaayyııssıı)) vvee ((bbuulluunndduu ==== yyaannllıışş)) if (sayilistesi[index] == aranan sayı) bulundu = doğru pozisyon = index end if index değişkenine 1 ekle. end while return pozisyon Doğrusal arama foksiyonu – C++ kodu int Listeyiara(int list[], int elemansayisi, int aranansayi) { int index = 0; int pozisyon = -1; char bulundu = ‘Y’; wwhhiillee (( ((iinnddeexx << eelleemmaannssaayyiissii)) &&&& ((bbuulluunndduu!!==‘‘DD’’)) )) { if (list[index] == aranansayi) { bulundu = ‘D’; // aranansayının bulunduğunu gösterir pozisyon = index; // aranan sayının lokasyonunu tutar. } index++;// bir sonraki pozisyondaki elemanı araması için. } return pozisyon; // aranansayının lokasyonunu ana programa } // döner veya -1 olarak döner. Doğrusal Arama Algoritması • Avantajları I. Anlaşılması kolay bir algoritmadır. II. Uygulamak için dizinin sıralı olması gerekmez!.. • Dezavantajları I. Yavaştır. (çok elemanı olan diziler için) Eğer aranan sayı dizide mevcut değil ise tüm elemanların aranması gerekir, mevcut ise bulduğu yerde durur. Binary Arama Algoritması- Örnek • Dizi (Array) sayilistesi içerisindeki sayılar aşağıdaki gibidir: 2 3 5 11 17 23 29 • 11, elemanı aranıyorsa , 11 test edilir ve binary arama durur!.. • 7, elemanı aranıyorsa binary arama 11, 3, 5, değerlerini test edip durur. Binary Arama Algoritması ilkindex değerini 0 yap. sonindex değerini dizinin son elemanının pozisyon değerine eşitle. bulundu=‘Y’; pozisyon= -1. While ( (bulundu !=‘D’ ) ve (ilkindex <= sonindex) ) ortaindex = (ilkindex+sonindex) / 2 IIff ((ddiizzii[[oorrttaaiinnddeexx]] ==== aarraannaann ddeeğğeerr)) bulundu=‘D’ pozisyon=ortaindex Else If (dizi[ortaindex] > aranandeğer) sonindex=ortaindex - 1. Else ilkindex= ortaindex + 1. End If. End While. return pozisyon. Binary Arama Fonksiyonu – C++ Kodu int binaryArama(int dizi[], int boyut, int aranansayi) { int ilk = 0, // dizideki ilk değer son = boyut - 1, // dizideki son değer orta, // aramanın orta noktası pozisyon = -1; // aranansayi nin lokasyon değeri char bulundu = ‘Y’; // aranansayının bulunup bulunmadığı wwhhiillee (( ((bbuulluunndduu !!==‘‘DD’’)) &&&& ((iillkk <<== ssoonn)) )) { orta = (ilk + son) / 2; // orta noktayı hesapla if (dizi[orta] == aranansayi) // Eğer aranansayı dizinin ortasında ise { bulundu = ‘D’; // bulundu DOĞRU olarak atanmalı pozisyon = orta; // aranansayının pozisyonu tutulur } else if (dizi[orta] > aranansayi) // Eğer aranan sayı daha küçük ise son = orta - 1; // dizinin ilk yarısını arar. else ilk = orta + 1; // aksi takdirde dizinin ikinci yarısını arar. } return pozisyon; } Uygulama Programı • Takip eden 2 slaytta sayıların girilebileceği bir fonksiyon; • Girilen sayıların dizi içerisinde, girildiği şekliyle aranabilmesini sağlayan bir fonksiyon; •• GGiirriilleenn ssaayyııllaarrıı ssıırraallaayyaann bbiirr ffoonnkkssiiyyoonn;; • Binary arama yapan bir modül; • Dizi içerisinden değerleri ekrana yansıtmak için bir fonksiyon bulunmaktadır. • Dikkatlice inceleyiniz. while ( (bulundu == 'F') && (ilk <= son) ) #include<iostream.h> { #include<stdio.h> orta = (ilk + son) /2; #define max 10 if ( List[orta] == aranandeger ) { void List(int L[],int numElems) bulundu = 'T'; { pozisyon = orta ; for(int i=0;i<numElems;i++) } { cout <<i <<". sayiyi gir----> "; cin>>L[i]; } else if ( List[orta] > aranandeger ) } son = orta -1; else ilk = orta + 1; int Listedenara(int List[],int boyut,int aranandeger) } { return pozisyon; int indeks=0; } int pozisyon=-1; char bulundu='F'; void L_siralama(int List[], int boyut) while ((indeks<boyut) && (bulundu=='F')) { { int i,k, gecici; iiff((LLiisstt[[iinnddeekkss]]====aarraannaannddeeggeerr)) ffoorr ((ii==11;;ii<<bbooyyuutt;;ii++++)) { { k=i; bulundu='T'; while ((List[k]<List[k-1]) && (k>0)) pozisyon=indeks; { } gecici=List[k]; indeks++; List[k]=List[k-1]; } List[k-1]=gecici; return pozisyon; k--; } } } int B_arama(int List[], int boyut, int aranandeger) } { void diziyi_goster( int List[], int boyut) int ilk = 0, { son = boyut-1, int i; orta, pozisyon = -1; for (i=0;i<boyut;i++) char bulundu = 'F'; cout << i << ". sayi --->" <<List[i] <<"\n"; } sayfa 1 sayfa 2
Description: