Sunteți pe pagina 1din 2

Algoritmul de cutare binar este un algoritm de cutare folosit pentru a gsi un element ntr-o list ordonat (tablou unidimensional/vector).

Algoritmul funcioneaz pe baza tehnicii divide et impera. Valoarea cutat este comparat cu cea a elementului din mijlocul listei. Dac e egal cu cea a acelui element, algoritmul se termin. Dac e mai mare dect acea valoare, algoritmul se reia, de la mijlocul listei pn la sfrit, iar dac e mai mic, algoritmul se reia pentru elementele de la nceputul listei pn la mijloc. ntruct la fiecare pas cardinalul mulimii de elemente n care se efectueaz cutarea se njumtete, algoritmul are complexitate logaritmic. Considerm un tablou unidimensional v de n elemente deja sortat, i trei variabile: i=inceput, s=sfrit i m=mijloc. Metoda verific de mai multe ori dac mijlocul vectorului/tabloului unidimensional este egal cu elementul cutat: n cazul n care este egal, variabila m reprezint poziia elementului n vector; dac nu se ndeplinete condiia de egalitate se trece la verificarea poziiei elementului cutat n vector astfel: dac elementul cutat este mai mic dect elementul din mijlocul vectorului, variabila "s" ia valoarea lui "m" iar dac nu variabila i ia valoarea lui m.Totul se repet ct timp i este mai mic dect s. Exemplu de cutare binar recursiv: #include<iostream> using namespace std; int n,x,v[10],m; int caut (int s, int d) { if(s>d) return -1; else { m =(s+d)/2; if (x==v[m]) return m; if (x<v[m]) return caut(s,m-1); else return caut(m+1,d); } } int main() { cout<<"n,x "; cin>>n>>x; cout<<"dati "<<n<<" elemente (in ordine crescatoare).\n"; for (int i=1;i<=n;i++) cin>>v[i]; cout<<"elementul "<<x<<" a fost gasit pe pozitia: "<<caut (1,n); return 0; }

Cautare binara

In general pentru a gasi o valoare intr-un tablou unidimensional nesortat, ar trebui sa cautam printre elementele sale luand fiecare element in parte pana cand valoarea este gasita. In medie, complexitatea unui asemenea algoritm este proportionala cu lungimea tabloului.Situatia se schimba atunci cand tabloul este sortat. Algoritmul 1.se ia elementul din mijlocul tabloului 2.daca elementul din mijlocul tabloului este egal cu valoarea cautat, algoritmul se opreste. 3.altfel, sunt 2 cazuri posibile: 3.1. valoarea cautata este mai mica decat elementul din mijloc. In acest caz, ne ducem la pasul 1 pentru partea tabloului dinaintea elementului din mijloc. 3.2. valoarea cautata este mai mare decat elementul din mijloc. In acest caz, ne ducem la pasul 1 pentru partea tabloului de dupa elementul din mijloc. Dupa acesti pasi, trebuie stabilit cand se opreste algoritmul. Primul caz este atunci cand elementul cautat este gasit. Al doilea este atunci cand subtabloul nu mai are elemente. In acest caz putem trage concluzi ca valoarea cautata nu se afla in tablou. Exemplu Sa gasim valoarea 6 in tabloul {-1, 5, 6, 18, 19, 25, 46, 78, 102, 114}. Pasul 1 (elementul din mijloc este 19 > 6 ) : -1 5 6 18 19 25 46 78 102 114 Pasul 2 (elementul din mijloc este 5 < 6 ): -1 5 6 18 19 25 46 78 102 114 Pasul 3 (elementul din mijloc este 6 == 6): -1 5 6 18 19 25 46 78 102 114 Functia care executa cautarea binara

1. int cautareBinara(int vect[],int valoare,int stanga,int dreapta) 2. { 3. while (stanga <= dreapta) { 4. int mijloc = (stanga + dreapta) / 2; 5. if (vect[mijloc] == valoare) 6. return mijloc; 7. else if (vect[mijloc] > valoare) 8. dreapta = mijloc - 1; 9. else 10. stanga = mijloc + 1; 11. } 12. return -1; 13. }