Sari la conținut
EduCamp

Tematică științifică · 1.8

Algoritmi de căutare

Căutarea secvențială și căutarea binară, cu pașii fiecărui algoritm, implementarea iterativă și recursivă, greșelile care opresc algoritmul și criteriul de alegere între metode.

Programa prevede două metode: căutarea secvențială și căutarea binară.

Deosebirea dintre ele este de ordin de mărime. Într-un vector cu un milion de elemente, prima efectuează în cazul cel mai defavorabil un milion de comparații, a doua douăzeci. Căutarea binară cere însă o condiție: vectorul trebuie să fie ordonat.

Căutarea secvențială

Pașii algoritmului

PasulCe se execută
Pas 1.Se inițializează i ← 1 și gasit ← fals.
Pas 2.Dacă i ≤ n și gasit = fals, se merge la Pas 3; altfel, se merge la Pas 5.
Pas 3.Dacă v[i] = x, valoarea a fost găsită: gasit ← adevărat și poz ← i. Se revine la Pas 2.
Pas 4.Altfel, i ← i + 1. Se revine la Pas 2.
Pas 5.Dacă gasit = adevărat, valoarea căutată se află pe poziția poz; altfel, ea nu apare în vector.
i ← 1; gasit ← fals
cât timp i ≤ n și gasit = fals execută
    dacă v[i] = x atunci
        gasit ← adevărat; poz ← i
    altfel
        i ← i + 1
    sfdacă
sfcât timp
/* Întoarce poziția lui x în v[0..n-1], sau -1 dacă valoarea nu apare. */
int secventiala(int v[], int n, int x) {
    for (int i = 0; i < n; i++)
        if (v[i] == x) return i;
    return -1;
}

Observație. Metoda nu impune nicio condiție vectorului. Se aplică pe date neordonate, pe orice tip de elemente între care este definită egalitatea și pe structuri care se pot parcurge numai element cu element, cum sunt listele înlănțuite.

CazulNumărul de comparații
favorabil1, valoarea se află pe prima poziție
mediuaproximativ n/2
defavorabiln, valoarea se află pe ultima poziție sau lipsește

Ordinul de complexitate este O(n).

Căutarea binară

La fiecare pas, mulțimea în care se mai caută se înjumătățește.

Pașii algoritmului

Se folosesc: s pentru primul indice al zonei în care se caută, d pentru ultimul, m pentru indicele elementului din mijloc și poz pentru poziția pe care s-a găsit valoarea. Cât timp valoarea nu a fost găsită, poz are valoarea 0.

PasulCe se execută
Pas 1.Se inițializează indicii s ← 1 și d ← n, iar poz ← 0.
Pas 2.Dacă zona se mai poate împărți, adică s ≤ d, și valoarea nu a fost încă găsită, adică poz = 0, se merge la Pas 3; altfel, se merge la Pas 6.
Pas 3.Se calculează indicele elementului din mijlocul zonei: m ← [(s + d) / 2].
Pas 4.Dacă v[m] = x, valoarea a fost găsită: poz ← m. Se revine la Pas 2.
Pas 5.Dacă v[m] < x, căutarea continuă în subvectorul din dreapta și s ← m + 1; altfel, căutarea continuă în subvectorul din stânga și d ← m - 1. Se revine la Pas 2.
Pas 6.Dacă poz > 0, valoarea căutată se află pe poziția poz; altfel, s a trecut de d, zona în care se mai putea căuta este vidă, iar valoarea nu apare în vector.
s ← 1; d ← n; poz ← 0
cât timp s ≤ d și poz = 0 execută
    m ← [(s + d) / 2]
    dacă v[m] = x atunci
        poz ← m
    altfel
        dacă v[m] < x atunci
            s ← m + 1
        altfel
            d ← m - 1
        sfdacă
    sfdacă
sfcât timp
int binara(int v[], int n, int x) {
    int st = 0, dr = n - 1;

    while (st <= dr) {
        /* Mijlocul se calculează astfel, nu ca (st + dr) / 2: pentru
           vectori foarte mari, suma celor doi indici poate depăși
           domeniul tipului int. */
        int mij = st + (dr - st) / 2;

        if (v[mij] == x) return mij;
        if (v[mij] < x) st = mij + 1;
        else            dr = mij - 1;
    }

    return -1;
}

Varianta recursivă, cerută la subcapitolul despre subprograme recursive:

int binaraRec(int v[], int st, int dr, int x) {
    if (st > dr) return -1;

    int mij = st + (dr - st) / 2;

    if (v[mij] == x) return mij;
    if (v[mij] < x) return binaraRec(v, mij + 1, dr, x);
    return binaraRec(v, st, mij - 1, x);
}

Exemplu. Vectorul 2, 5, 8, 12, 16, 23, 38, 56, 72, 91, cu indici de la 0 la 9. Se caută valoarea 23.

Materialul acesta se citește pe educamp.ro și nu se tipărește.

Ce cuprinde subcapitolul

  1. Căutarea secvențială
  2. Căutarea binară
  3. Numărul de pași
  4. Când se ordonează vectorul înainte de căutare
  5. Alte întrebuințări ale căutării binare
  6. Apariții la examen

Continuă lectura ca și cursant

Cel puțin un subcapitol din fiecare capitol este disponibil gratuit și integral. Pentru a citi toate celelalte subcapitole ale disciplinei, te înscrii la cursul de pregătire.

Te înscrii, alegi în cont când începe cursul și plătești prima lună prin transfer bancar. Pentru a vedea mai întâi cum este prezentată materia, poți reveni la primul subcapitol al capitolului.

Acces la suportul de curs

25 RON / lună, fără ședințe

Ce cuprinde:

  • Acces la toate lecțiile disponibile
  • Suport de curs pentru tematica științifică și metodică
  • Exemple, explicații și exerciții
  • Acces la materialele noi adăugate pe platformă
  • Posibilitatea de a adresa întrebări

Poți alege și variante cu ședințe online, în grup sau individuale. Le vezi pe pagina cursului.

Ai întrebări sau o problemă? Scrie-mi pe WhatsApp, la 0745 874 576.

Înscrie-te Alte varianteCum plătești Login

Surse (3)
  • Cerchez, E., Șerban, M., „Programarea în limbajul C/C++ pentru liceu”, Editura Polirom, Iași, 2005
  • „Informatică. Manual pentru clasa a XI-a”, Editura Didactică și Pedagogică, București
  • „Metode și tehnici clasice de programare”, suport de curs
Actualizat: 20 octombrie 2026