Arama Algoritmaları Doğrusal Arama ve Binary Arama
Doğrusal Arama-Örnek Dizi (Array) sayilistesiiç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 1olarak atayınız; index değişkenini 0 olarak atayınız. while (index < dizideki eleman sayısı) ve(bulundu == yanlış) 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 ; while ( (index < elemansayisi) && (bulundu!= D ) ) 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 AramaAlgoritması-Örnek Dizi (Array) sayilistesiiç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 If (dizi[ortaindex] == aranan değer) bulundu= D pozisyon=ortaindex Else If (dizi[ortaindex] > aranandeğer) sonindex=ortaindex - 1. Else ilkindex= ortaindex + 1. End If. End While. return pozisyon.
Binary AramaFonksiyonu 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ığı while ( (bulundu!= D ) && (ilk <= son) ) 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; Girilen sayıları sıralayan bir fonksiyon; Binary arama yapan bir modül; Dizi içerisinden değerleri ekrana yansıtmak için bir fonksiyon bulunmaktadır. Dikkatlice inceleyiniz.
#include<iostream.h> #include<stdio.h> #define max 10 void List(int L[],int numelems) for(int i=0;i<numelems;i++) cout <<i <<". sayiyi gir----> "; cin>>l[i]; int Listedenara(int List[],int boyut,int aranandeger) int indeks=0; int pozisyon=-1; char bulundu='f'; while ((indeks<boyut)&&(bulundu=='f')) if(list[indeks]==aranandeger) bulundu='t'; pozisyon=indeks; indeks++; return pozisyon; int B_arama(int List[], int boyut, int aranandeger) int ilk = 0, son = boyut-1, orta, pozisyon = -1; char bulundu = 'F'; sayfa 1 while ( (bulundu == 'F') && (ilk <= son) ) orta = (ilk + son) /2; if ( List[orta] == aranandeger ) bulundu = 'T'; pozisyon = orta ; else if ( List[orta] > aranandeger ) son = orta -1; else ilk = orta + 1; return pozisyon; void L_siralama(int List[], int boyut) int i,k, gecici; for (i=1;i<boyut;i++) k=i; while ((List[k]<List[k-1]) &&(k>0)) gecici=list[k]; List[k]=List[k-1]; List[k-1]=gecici; k--; void diziyi_goster( int List[], int boyut) int i; for (i=0;i<boyut;i++) cout << i << ". sayi --->" <<List[i] <<"\n"; sayfa 2
int main() int i,aranacakdeger, hedef; int L1[max]; List(L1,max); cout << " bir sayi aratmak icin deger giriniz-----> "; cin >> aranacakdeger; hedef=listedenara(l1,max, aranacakdeger); if (hedef >=0) cout << "aranan hedef sayının pozisyonu ----> " << hedef << "\n"; else cout << " aranan deger mevcut degildir!... \n"; L_siralama(L1,max); diziyi_goster(l1,max); cout << " bir sayi aratmak icin deger giriniz-----> "; cin >> aranacakdeger; hedef=b_arama(l1,max,aranacakdeger); if (hedef >=0) cout << "aranan hedef sayının pozisyonu ----> " << hedef << "\n"; else cout << " aranan deger mevcut degildir!... \n"; return 0; sayfa 3
Sıralama Algoritmaları Sıralama algoritmalarından iki tanesi anlatılacaktır. 1. Bubble Sıralama Algoritması 2. Seçerek sıralama Algoritması
Bubble Sıralama (Bubble Sort) Yöntem: İlk iki elemanı kıyasla ve Eğer istenilen sırada değilse yerlerini değiştir. Bir adım ilerleyerek ikinci ve üçüncü elemanları kıyasla ve gerekiyorsa yer değiştir. Dizinin (array in) sonuna kadar bu işlemi yapmaya devam et. Ve tekrar array üzerinde hareket etmeye, yer değişikliği gerekli olduğu sürece devam edin. Hiç yer değiştirme olmayıncaya kadar bu işlemi tekrarlayınız.
Örnek Dizi üzerinden 1. kez geçiş Yeni Dizi (Array) liste aşağıdaki gibidir: 17 23 5 11 17-23 karşılaştırılıp gerekmiyorsa Yerleri değiştirilmez!.. 23 ile 5 kıyaslanır ve Yerleri değiştirilir. 11 ile 23 kıyaslanır ve Yerleri değiştirilir.
Örnek Dizi üzerinden 2. kez geçiş 1. Geçişten sonra, dizi (array) liste şöyle olur: 17 5 11 23 17 ile 5 kıyaslanır Yer değiştirilir. 17 ile 11 kıyaslanır Yer değiştirilir 17 ile 23 kıyaslanır Yer değiştirilmez. 8-15
Örnek 3. kez geçiş 2. geçişten sonra, dizi (array) liste şöyle olur: 5 11 17 23 5 ve 11 kıyaslanır, doğru sırada Olduğu için değişim yapılmaz 11 ve17 kıyaslanır, Yine değişikliğe gerek Yoktur. 17 ve 23 için de Değişikliğe gerek yoktur. Yer değişimi yok, ozaman Dizi (array) istediğimiz sıralamadadır. 8-16
Bubble Sıralama fonksiyonu aşağıdaki gibidir. Küçük modifikasyonlar yapılmıştır!.. Void B_siralama(int List[], int boyut) int i,k, gecici; for (i=1;i<boyut;i++) k=i; while ((List[k]<List[k-1]) && (k>0)) gecici=list[k]; List[k]=List[k-1]; List[k-1]=gecici; k--;
Void B_siralama(int List[], int boyut) int i,k, gecici; for (i=1;i<boyut;i++) k=i; while ((List[k]<List[k-1]) && (k>0)) gecici=list[k]; List[k]=List[k-1]; List[k-1]=gecici; k--; 0 1 2 3 4 5 i k Değişim? gecici 0 5 2 4 9-2 1 1 Yok 0 5 2 4 9-2 2 2 var 2 0 2 5 4 9-2 1 Yok 0 2 5 4 9-2 3 3 var 4 0 2 4 5 9-2 2 Yok 0 2 4 5 9-2 1 yok 0 2 4 5 9-2 4 4 Yok 0 2 4 5 9-2 5 5 Var -2 0 2 4 5-2 9 4 Var -2 0 2 4-2 5 9 3 Var -2 0 2-2 4 5 9 2 Var -2 0-2 2 4 5 9 1 Var -2-2 0 2 4 5 9
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 If (dizi[ortaindex] == aranan değer) bulundu= D pozisyon=ortaindex Else If (dizi[ortaindex] > aranandeğer) sonindex=ortaindex - 1. Else ilkindex= ortaindex + 1. End If. End While. return pozisyon. 0 1 2 3 4 5 6 7 8 9-2 0 2 4 5 6 8 9 14 15 Aranan değer ilk son orta Bulundu Pozisyon 0