Clasa a IX-a · Sortare și căutareRead in English
Căutarea binară în C++
În engleză: Binary search
Ideea
Funcționează doar pe un vector sortat crescător. Comparăm x cu elementul din mijlocul zonei [st, dr]: dacă e egal, am terminat; dacă x e mai mic, căutăm în stânga mijlocului, altfel în dreapta. La fiecare pas zona se înjumătățește. Se afișează o poziție pe care se află x sau NU.
Descrierea în engleză
It only works on an array sorted in increasing order. We compare x with the middle element of the range [st, dr]: if they are equal, we are done; if x is smaller, we search left of the middle, otherwise to the right. At every step the range is halved. A position where x is found is printed, or NO.
- Complexitate
- O(log n)
- Clasa
- Clasa a IX-a (Grade 9)
- Capitol
- Sortare și căutare
Exemple
Intrare
8 2 5 8 12 16 23 38 56 23
Ieșire așteptată
6
Intrare
8 2 5 8 12 16 23 38 56 7
Ieșire așteptată
NU
Codul C++
Codul complet, cu comentarii în română. Îl poți modifica liber și îl poți reseta oricând.
/*
* Titlu: Căutarea binară
* Clasa: 9
* Capitol: Sortare și căutare
* Descriere: Funcționează doar pe un vector sortat crescător. Comparăm x cu
* elementul din mijlocul zonei [st, dr]: dacă e egal, am terminat;
* dacă x e mai mic, căutăm în stânga mijlocului, altfel în dreapta.
* La fiecare pas zona se înjumătățește. Se afișează o poziție pe care
* se află x sau NU.
* Complexitate: O(log n)
*
* Exemplu
* Intrare:
* 8
* 2 5 8 12 16 23 38 56
* 23
* Ieșire: 6
*
* Exemplu
* Intrare:
* 8
* 2 5 8 12 16 23 38 56
* 7
* Ieșire: NU
*/
#include <iostream>
using namespace std;
int v[100001];
int main()
{
int n, x;
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> v[i];
}
cin >> x;
int st = 1, dr = n, poz = 0;
while (st <= dr && poz == 0)
{
int mij = (st + dr) / 2;
if (v[mij] == x)
{
poz = mij;
}
else if (x < v[mij])
{
dr = mij - 1;
}
else
{
st = mij + 1;
}
}
if (poz != 0)
{
cout << poz << '\n';
}
else
{
cout << "NU" << '\n';
}
return 0;
}
Rulează pe un g++ adevărat (C++17, -O2) prin Compiler Explorer. Programele trebuie să se termine repede: există o limită de timp.