Didaxis
lecție · Informatică

Căutarea binară

Căutarea binară este un algoritm care găsește o valoare într-un vector sortat comparând-o cu elementul din mijlocul zonei de căutare: dacă e mai mică, continuă în jumătatea stângă, dacă e mai mare, în cea dreaptă. Zona se înjumătățește la fiecare pas: pentru 1 000 de elemente sunt suficiente cel mult 10 comparații, față de 1 000 la căutarea secvențială.

Se face în:
Clasa a X-a
Clasa a XI-a
Actualizat la: 30 octombrie 2026
1pe scurtstratul 1 din 3 · rezumatul lecției

Pe scurt

Căutarea binară funcționează pe un tablou sortat. Comparăm valoarea căutată cu elementul din mijloc și păstrăm numai jumătatea în care mai poate apărea. În , căutarea lui 9 vede mai întâi 7 la indicele 2, apoi restrânge intervalul la indicii 3–4 și găsește 9.

Desen la lecția „Căutarea binară”
2în detaliustratul 2 din 3 · pentru clasă și Bacalaureat

În detaliu

Căutarea binară funcționează numai pe un tablou sortat. Se păstrează un interval de căutare [st, dr], inițial tot tabloul. La fiecare pas se alege elementul din mijloc, mij = st + (dr - st) / 2, și se compară cu valoarea căutată : dacă v[mij] == x, căutarea s-a terminat; dacă v[mij] < x, valoarea poate fi doar în dreapta, deci st = mij + 1; altfel poate fi doar în stânga, deci dr = mij - 1. Dacă intervalul devine gol (st > dr), valoarea lipsește. Intervalul se înjumătățește la fiecare pas, deci numărul de pași este cel mult : pentru sunt cel mult 10 pași, iar pentru cel mult 30. Expresia st + (dr - st) / 2 evită depășirea tipului pe care ar putea-o produce (st + dr) / 2 la valori mari.

Exemplul 1 — valoare găsită. În tabloul se caută .

#include <iostream>
using namespace std;
int main() {
    int v[] = {2, 4, 7, 9, 12};
    int st = 0, dr = 4, x = 9, poz = -1;
    while (st <= dr) {
        int mij = st + (dr - st) / 2;
        if (v[mij] == x) { poz = mij; break; }
        if (v[mij] < x) st = mij + 1;
        else dr = mij - 1;
    }
    cout << poz;
    return 0;
}

Primul mijloc este 2, cu valoarea 7, mai mică decât 9, deci st devine 3. Al doilea mijloc este , cu valoarea 9: găsit. Se afișează 3, după două comparații cu elementele tabloului.

Exemplul 2 — valoare absentă. Se caută în același tablou.

  1. st = 0, dr = 4, mij = 2: , deci dr = 1.
  2. st = 0, dr = 1, mij = 0: , deci st = 1.
  3. st = 1, dr = 1, mij = 1: , deci st = 2.
  4. st = 2 este mai mare decât dr = 1, intervalul este gol și ciclul se oprește.

Poziția rămâne . S-au făcut trei comparații pentru cinci elemente, față de cinci comparații la căutarea secvențială.

Exemplul 3 — valori repetate. În tabloul sortat căutarea lui 3 găsește primul mijloc, indicele 2, care este una dintre aparițiile valorii, nu neapărat prima. Pentru prima apariție, după ce găsești v[mij] == x memorezi poz = mij și continui în stânga cu dr = mij - 1; algoritmul ajunge la indicele 1. Pentru ultima apariție continui în dreapta cu st = mij + 1; se obține 3.

Exemplul 4 — prima poziție care nu este mai mică decât . O variantă păstrează intervalul [st, dr), cu dr exclus, inițial st = 0 și dr = n. Ciclul while (st < dr) calculează mij = st + (dr - st) / 2 și face st = mij + 1 dacă v[mij] < x, altfel dr = mij. Invariantul este că toate elementele dinaintea lui st sunt mai mici decât , iar cele de la dr încolo sunt mai mari sau egale cu . La final st este numărul elementelor mai mici decât . Pentru și : mij = 2 (valoarea 7 nu este mai mică) face dr = 2; apoi mij = 1 (valoarea 4 este mai mică) face st = 2, iar rezultatul 2 este poziția în care s-ar insera 6. În se obține 1 pentru (prima apariție) și 4 pentru . Dacă este mai mare decât toate elementele, rezultatul este .

Numărul de pași și precondiția. Numărul maxim de pași este : 3 pentru , 10 pentru și 20 pentru . Precondiția sortării nu este opțională. În tabloul nesortat căutarea lui 2 reușește din întâmplare (mijlocul este chiar elementul 2), dar căutarea lui 1 întoarce , deși 1 este pe poziția 3: la primul pas și algoritmul renunță la jumătatea din dreapta, unde se afla valoarea.

3pentru admiterestratul 3 din 3 · pentru examene

Pentru admitere

Verifică precondiția sortării și sensul ei. Pentru date descrescătoare, ramurile de actualizare trebuie inversate. Codul din primul exemplu întoarce o apariție, nu neapărat prima dintre duplicate. Atenție la limitele intervalului: st <= dr în condiția ciclului acoperă cazul intervalului cu un singur element, iar actualizările mij + 1 și mij - 1 garantează că intervalul se micșorează; dacă s-ar scrie st = mij, ciclul ar putea să nu se mai termine. Când enunțul cere numărul de pași, urmărește valorile st, dr și mij în tabel.

Exemplu în formatul examenului. Ce se afișează în urma executării secvenței de mai jos?

int v[] = {2, 4, 7, 9, 12, 15, 20};
int st = 0, dr = 6, x = 15, poz = -1, pasi = 0;
while (st <= dr) {
    int mij = (st + dr) / 2;
    pasi++;
    if (v[mij] == x) { poz = mij; break; }
    if (v[mij] < x) st = mij + 1;
    else dr = mij - 1;
}
cout << poz << ' ' << pasi;
  • a) 5 2
  • b) 5 3
  • c) 4 2
  • d) -1 3

Ideea. Compari cu elementul din mijloc. Dacă sunt egale, ai terminat. Dacă este mai mic, toate elementele din dreapta mijlocului sunt și ele mai mari decât , deci îl cauți doar în stânga; dacă este mai mare, doar în dreapta. Zona în care poate fi se înjumătățește la fiecare pas, până când îl găsești sau zona devine goală. Cu pozițiile și zona , algoritmul este, în pseudocod:

citește n, v[1], …, v[n] (sortat crescător), x
st ← 1; dr ← n; poz ← 0
┌cât timp st ≤ dr și poz = 0 execută
│  m ← [(st + dr) / 2]
│ ┌dacă v[m] = x atunci
│ │  poz ← m
│ │altfel
│ │ ┌dacă x < v[m] atunci dr ← m - 1
│ │ │altfel st ← m + 1
│ │ └■
│ └■
└■
scrie poz
Ce Căutarea binară (vector sortat crescător, pozițiile )
Zona de căutare st = 1, dr = n; cât timp st <= dr
Mijlocul m = (st + dr) / 2
Pasul dacă v[m] == x, ai găsit; dacă x < v[m], dr = m - 1; altfel st = m + 1
Nu există bucla se termină cu st > dr
Comparații, în cel mai rău caz : 7 pentru , 10 pentru
Condiția vectorul trebuie să fie sortat

De ce e atât de rapidă. După comparații, zona de căutare are cel mult elemente. Ea rămâne nevidă doar cât timp , deci se fac cel mult comparații. Pentru un milion de elemente înseamnă 20 de comparații, față de un milion la căutarea secvențială. Metoda este un caz particular de divide et impera, în care se continuă într-o singură jumătate.

Variante utile. Aceeași idee găsește și alte poziții, dacă schimbi ce faci la egalitate: prima poziție cu v[i] >= x (unde ar trebui inserat ca vectorul să rămână sortat), prima poziție cu o valoare egală cu când sunt mai multe egale, sau numărul de apariții ale lui . Căutarea binară se aplică și pe valorile unei funcții crescătoare, de exemplu ca să afli cel mai mare număr natural cu .

Același tablou arată și numărul de pași în alte cazuri. Pentru mijloacele sunt 3, 5 și 6, deci valoarea se găsește după 3 pași, pe poziția 6. Pentru și pentru , valori care lipsesc, secvența face tot 3 pași și afișează -1 3. Cu 7 elemente nu se poate depăși pași, indiferent dacă valoarea există sau nu. Un răspuns care indică 4 pași pentru acest tablou arată că s-a numărat greșit, de exemplu s-a reluat un interval deja eliminat.

Exemple rezolvate

Exemplul 1: urmărirea pașilor. În vectorul 3, 8, 15, 21, 27, 34, 42, 50, 61 caută 42, apoi 10.

  1. Pentru 42: st = 1, dr = 9, m = 5, v[5] = 27 < 42, deci st = 6; m = 7, v[7] = 42: găsit pe poziția 7, după 2 comparații.
  2. Pentru 10: m = 5, v[5] = 27 > 10, deci dr = 4; m = 2, v[2] = 8 < 10, deci st = 3; m = 3, v[3] = 15 > 10, deci dr = 2. Acum st > dr: 10 nu există. Au fost comparate cu valorile 27, 8, 15.
#include <iostream>
using namespace std;

int v[] = {0, 3, 8, 15, 21, 27, 34, 42, 50, 61}, n = 9;

int cauta(int x) {
    int st = 1, dr = n;
    while (st <= dr) {
        int m = (st + dr) / 2;
        cout << v[m] << " ";          // elementul comparat cu x
        if (v[m] == x)
            return m;
        if (x < v[m])
            dr = m - 1;
        else
            st = m + 1;
    }
    return 0;
}

int main() {
    int p = cauta(42);
    cout << "-> " << p << "\n";
    p = cauta(10);
    cout << "-> " << p << "\n";
    return 0;
}

Programul afișează, pentru fiecare căutare, elementele comparate și poziția găsită (0 dacă lipsește):

27 42 -> 7
27 8 15 -> 0

Exemplul 2: numărul maxim de comparații. Care este numărul maxim de elemente comparate cu la căutarea binară într-un vector sortat cu 100 de elemente? Dar cu 1000?

  1. După fiecare comparație fără succes, zona rămasă are cel mult jumătate din elemente: 100, 50, 25, 12, 6, 3, 1. Sunt 7 zone nevide, deci cel mult 7 comparații.
  2. Pentru 1000: , deci cel mult comparații.
#include <iostream>
using namespace std;

int main() {
    int n;
    cin >> n;                         // vectorul este 1, 2, ..., n
    int maxim = 0;
    for (int x = 0; x <= n; x++)      // x = 0 lipseste; celelalte exista
        for (int t = 0; t < 2; t++) {
            int st = 1, dr = n, nr = 0;
            double cautat = x + 0.5 * t;   // si valori dintre elemente
            while (st <= dr) {
                int m = (st + dr) / 2;
                nr++;
                if (m == cautat) break;
                if (cautat < m) dr = m - 1;
                else st = m + 1;
            }
            if (nr > maxim) maxim = nr;
        }
    cout << maxim << "\n";
    return 0;
}

Programul încearcă toate valorile din vector și toate valorile aflate între ele. Pentru intrarea 100, afișează:

7

Pentru 1000 afișează 10.

Exemplul 3: prima apariție și numărul de apariții. În vectorul sortat 2, 4, 4, 4, 7, 9, câte apariții are valoarea 4?

  1. Prima poziție cu v[i] >= 4 este 2; prima poziție cu v[i] > 4 este 5.
  2. Numărul de apariții este .
  3. Funcția caută prima poziție i cu v[i] >= x: dacă v[m] >= x, răspunsul este m sau la stânga lui, deci reții m și continui în stânga.
#include <iostream>
using namespace std;

int v[] = {0, 2, 4, 4, 4, 7, 9}, n = 6;

int primaPoz(int x) {                 // prima pozitie cu v[i] >= x, sau n + 1
    int st = 1, dr = n, rez = n + 1;
    while (st <= dr) {
        int m = (st + dr) / 2;
        if (v[m] >= x) {
            rez = m;
            dr = m - 1;
        } else
            st = m + 1;
    }
    return rez;
}

int main() {
    cout << primaPoz(4) << " " << primaPoz(5) - primaPoz(4) << " " << primaPoz(10) << "\n";
    return 0;
}

Programul afișează prima poziție a lui 4, numărul aparițiilor lui și poziția la care s-ar insera 10:

2 3 7

Exemplul 4: partea întreagă a radicalului. Se citește un număr natural . Află cel mai mare număr natural cu , fără funcția sqrt. Pentru , , pentru că .

  1. Funcția este crescătoare, deci cauți binar pe valorile lui , între 0 și .
  2. Dacă , este un candidat și poate exista unul mai mare: reții și cauți în dreapta. Altfel cauți în stânga.
#include <iostream>
using namespace std;

int main() {
    long long n;
    cin >> n;
    long long st = 0, dr = n, r = 0;
    while (st <= dr) {
        long long m = (st + dr) / 2;
        if (m * m <= n) {
            r = m;
            st = m + 1;
        } else
            dr = m - 1;
    }
    cout << r << "\n";
    return 0;
}

Pentru intrarea 2026, programul afișează:

45

Variabilele sunt long long, pentru că m * m depășește tipul int: pentru , primul mijloc este 500 000 000, iar pătratul lui are 18 cifre.

Exemplul 5: nivel de examen, valorile comparate. Un vector sortat are 15 elemente, valorile 10, 20, 30, …, 150. Care sunt valorile cu care este comparat și câte comparații se fac?

  1. m = 8, v[8] = 80 < 125, deci st = 9.
  2. m = 12, v[12] = 120 < 125, deci st = 13.
  3. m = 14, v[14] = 140 > 125, deci dr = 13.
  4. m = 13, v[13] = 130 > 125, deci dr = 12 < st. Valoarea nu există.
  5. Valorile comparate: 80, 120, 140, 130, adică 4 comparații, numărul maxim pentru 15 elemente ().

Unde apare la examen

La Bacalaureatul la informatică, matematică-informatică, programa de examen cuprinde „Metode de căutare (secvențială, binară)” și analiza complexității unui algoritm, la algoritmii elementari (anexa 2 la OMECTS 4800/2010). Formatul probei și subiectele din 2026 sunt pe pagina subiectelor și baremelor Bac 2026; potrivit proiectului de ordin pentru Bacalaureatul 2027, programa rămâne aceeași.

Pe programa școlară veche, căutarea secvențială și căutarea binară sunt la clasa a X-a, la algoritmii de prelucrare a tablourilor (OMECI 5099/2009); pe programa nouă, ea este la clasa a X-a, din 2027–2028, la metodele de prelucrare a listelor sortate (OMEC 4370/2026).

Greșeli frecvente

  • Greșit: căutarea binară merge pe orice tablou.
    Corect: tabloul trebuie sortat în sensul presupus de algoritm.
  • Greșit: la v[mij] < x se actualizează dr.
    Corect: valoarea poate fi doar în dreapta, deci st = mij + 1.
  • Greșit: la valori repetate, căutarea binară găsește mereu prima apariție.
    Corect: găsește o apariție; pentru prima se continuă în stânga.
  • Greșit: căutarea binară funcționează la fel pe orice ordine a datelor.
    Corect: cere un tablou sortat conform comparațiilor folosite; pe un vector nesortat dă rezultate greșite, deci îl sortezi întâi sau cauți secvențial.
  • Greșit: după v[mij] < x păstrăm jumătatea stângă.
    Corect: păstrăm partea dreaptă.
  • Greșit: găsirea unei apariții garantează că este prima.
    Corect: duplicatele cer o variantă specială, ca în exemplul 3.
  • Greșit: condiția buclei poate fi st < dr.
    Corect: cu st < dr, zona cu un singur element nu mai este verificată, iar o valoare aflată acolo nu este găsită; condiția este st <= dr.
  • Greșit: actualizările pot fi dr = m sau st = m.
    Corect: se folosesc m - 1 și m + 1; altfel bucla poate să nu se mai termine, când st și dr sunt vecine.
  • Greșit: (st + dr) / 2 este mereu sigur.
    Corect: pentru indici foarte mari, st + dr poate depăși tipul int; forma st + (dr - st) / 2 evită depășirea.
în contul tăuPremium

Testează-te pe această lecție

Lecția o citești aici, fără cont. Testele pe lecții și capitole sunt în cont, cu grile originale Didaxis și explicația fiecăreia: gratuit 10 grile pe zi, fără limită cu Premium, 49 de lei pe lună pentru fiecare copil.

Înainte și după

Întrebări frecvente

Se poate folosi căutarea binară pe un vector nesortat?
Nu. Algoritmul elimină o jumătate presupunând că toate valorile din ea sunt prea mici sau prea mari, ceea ce e adevărat doar dacă vectorul este sortat. Pe un vector nesortat folosești căutarea secvențială, sau îl sortezi întâi.
Câți pași face căutarea binară?
Pentru un vector cu n elemente, cel mult [log₂ n] + 1 comparații ale lui x cu un element: 7 pentru 100 de elemente, 10 pentru 1 000, 20 pentru un milion.
Care este diferența dintre căutarea secvențială și cea binară?
Căutarea secvențială compară valoarea, pe rând, cu fiecare element și funcționează pe orice vector, dar face până la n comparații. Căutarea binară cere un vector sortat și face doar aproximativ log₂ n comparații.

Surse și referințe

Redactare proprie, conform programei:

  • OMECI 5099/2009, anexa 5, Informatică, p. 4–5, clasa X; plan de încadrare: OMECI 3410/2009, anexa 1, p. PDF 1–14; forum.isj.hd.edu.ro; filiera tehnologică: OMECI 3412/2009, anexa 2, tabel X, legislatie.just.ro
  • OMECI 5099/2009, anexa 5, Informatică, p. 4–5, clasa X intensiv; rocnee.eu
  • OMECI 5099/2009, anexa 5, Informatică, p. 4–5, clasa X; rocnee.eu
  • OMECI 5099/2009, anexa 5, Informatică, p. 4–5, clasa XI; plan de încadrare: OMEC 7723/2024, anexa 2, tabelele 1–25, legislatie.just.ro; filiera tehnologică: OMEC 7724/2024, anexa 4, tabelul calificării, legislatie.just.ro
  • UNSTPB, Regulament admitere licență 2026, Anexa II-1.2 p. Anx II-14 și Anexa XI-3 p. Anx XI-6–7 (PDF p. 64, 120–121); admitere.pub.ro
  • OMECTS 4800/2010, anexa 2, Informatică, p. 3 și 6; aplicabilitatea 2027: OMEC 5211/2026, art. 3 alin. (10); edu.ro
  • OMECTS 4800/2010, anexa 2, Informatică, p. 3–4; edu.ro
  • OMECTS 4800/2010, anexa 2, Informatică, p. 5–6; edu.ro

Documente consultate

  • UNSTPB, admitere 2026, anexa XI-3, p. Anx XI-6–7
  • Programa școlară de informatică, clasa a X-a (OMECI 5099/2009, anexa 5), CNCE; rocnee.eu
  • Programa de bacalaureat la informatică, matematică-informatică (anexa 2 la OMECTS 4800/2010), Ministerul Educației, p. 3–4; edu.ro
  • Programele școlare noi de informatică pentru clasele X–XII (OMEC 4370/2026, MO 591 bis/20.07.2026), CNCE; rocnee.eu
  • Proiect de ordin privind organizarea și desfășurarea Bacalaureatului, calendar 2027, Ministerul Educației; edu.ro

Desene: Redactare proprie (desen original)

lecțiile sunt gratuite

Ai citit lecția. Acum verifică-te.