Nu obții 100 de puncte sau ai nelămuriri în privința problemelor? Scrie-mi pe Instagram.
Ai găsit o greșeală, vrei să raportezi un utilizator sau vrei să comunici altceva? Folosește formularul de contact.
Vrei să ne transmiți o părere despre platformă? Folosește formularul de feedback.
Folosește următoarele shortcuturi pentru a naviga mai ușor pe platformă.
Meniu shortcuturi | ? |
Căutare probleme sau utilizatori | / |
Navigare printre rezultatele căutării | ↑, ↓ |
Meniu de contact și feedback | CTRL + Shift + F |
Ieșire din meniuri | Esc |
Setări editor | CTRL + Shift + S |
Schimbare stil editor | CTRL + Shift + E |
Șabloane de cod | CTRL + Shift + 1/2/3 |
Golire editor | CTRL + Shift + 4 |
Am învățat în clasa a IX-a despre algoritmul de Căutare binară (mai multe detalii aici). Algoritmul caută într-un mod eficient dacă un element există sau nu într-un șir ordonat crescător, reducând la fiecare pas câte jumătate din elementele șirului rămas.
În această lecție vom discuta despre o implementare recursivă a algoritmului în C++, foarte ușor de înțeles.
Căutarea binară este un algoritm care caută un element într-un șir de valori ordonate (de regulă, crescător). Căutarea se face prin următorul algoritm. Cât timp mai avem elemente:
Un exemplu concret se găsește la lecția pentru clasa a IX-a, împreună cu grafice.
Algoritmul recursiv se bazează pe o funcție (un subprogram). Acest subprogram este recursiv, adică îl vom apela pe el însuși în cadrul său.
Funcția va avea patru parametri: a[]
, un vector de numere întregi (sau de orice alt tip, în funcție de cerință), împreună cu doi indici st
și dr
, care marchează pozițiile de început și de final a secvenței curente în care căutăm elementul nostru, precum și valoarea de căutat: x
.
Funcția returnează 1
, dacă elementul x
a fost găsit, respectiv 0
în caz contrar.
Practic, după ce apelăm cautBin(a, 1, n, x)
, ne așteptăm să primim 1
sau 0
în funcție de existența lui x
în a
.
Funcția va face următoarele:
st
este mai mare strict decât dr
), atunci ne oprim;st
și dr
sunt egale), atunci returnăm 1
dacă acest element este egal cu x
, sau 0
în caz contrar;x
. În funcție de această comparație, fie returnăm 1
(dacă mijlocul este chiar egal cu x
), fie returnăm cautBin(a, st, mij - 1, x)
, sau cautBin(a, mij + 1, dr, x)
, după caz (dacă mijlocul este mai mare sau mai mic decât x
).Mai jos implementăm căutarea binară în C++ recursiv.
#include <iostream>
using namespace std;
int cautBin(int a[], int st, int dr, int x) {
//Explicații: infoas.ro
if(st > dr) return 0;
if(st == dr) {
if(a[st] == x) return 1;
else return 0;
}
int mij = (st + dr) / 2;
if(a[mij] == x) return 1;
else if(a[mij] < x) return cautBin(a, mij + 1, dr, x);
else return cautBin(a, st, mij - 1, x);
}
int main()
{
//Declarăm și citim datele în ordinea: lungimea șirului, elementele șirului și valoarea de căutat
int a[100], n, x;
cin >> n;
for(int i = 1; i <= n; i++) {
cin >> a[i];
}
cin >> x;
//Căutăm binar
if(cautBin(a, 1, n, x) == 1) {
cout << "Am gasit valoarea " << x << " in sir!";
} else {
cout << "Nu am gasit valoarea " << x << " in sir :(";
}
return 0;
}