Clasa a IX-a · Sortare și căutareRead in English

Căutarea binară în C++

În engleză: Binary search

O(log n)C++1767 de linii2 exemple

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)

Exemple

Exemplul 1

Intrare

8
2 5 8 12 16 23 38 56
23

Ieșire așteptată

6
Exemplul 2

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.

cautare-binara.cpp
/*
 * 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.