← Назад к алгоритмам поиска

Бинарный поиск

Поиск последнего элемента, меньшего x, в отсортированном массиве

🐍 Python
n = int(input())
A = list(map(int, input().split()))
x = int(input())

l, r = 0, n

while l < r - 1:
    m = (l + r) // 2
    if A[m] < x:
        l = m
    else:
        r = m

print(l)
⚙️ C++
#include <iostream>
#include <vector>
using namespace std;

int main() {
    int n, x;
    cin >> n;
    
    vector<int> A(n);
    for (int i = 0; i < n; i++)
        cin >> A[i];
    
    cin >> x;
    
    int l = 0, r = n, m;
    
    while (l < r - 1) {
        m = (l + r) / 2;
        if (A[m] < x)
            l = m;
        else
            r = m;
    }
    
    cout << l << endl;
    
    return 0;
}
Python (встроенная функция)
import bisect
index = bisect.bisect_left(A, x)
C++ (встроенная функция)
#include <algorithm>
int index = lower_bound(arr.begin(), arr.end(), x) - arr.begin();

Как работает бинарный поиск?

Этот алгоритм реализует правый бинарный поиск (или бинарный поиск по правой границе). Его цель — найти индекс последнего элемента в отсортированном массиве, который строго меньше заданного значения x.

Основная идея

Алгоритм поддерживает два указателя — l (левый) и r (правый). В любой момент времени выполняется важный инвариант:

Изначально l = 0, r = n. Это значит, что мы ничего не знаем об элементах (инвариант выполняется тривиально, так как отрезки пусты).

Шаги работы

Завершение алгоритма

Когда цикл заканчивается, l и r становятся соседними индексами (r = l + 1). При этом:

Временная сложность: O(log n), где n — размер массива.

Пример работы

Для массива A = [1, 3, 5, 7, 9, 11, 13] и x = 10:

Начало: l=0, r=7
m=3 → A[3]=7 < 10 → l=3
m=5 → A[5]=11 >= 10 → r=5
m=4 → A[4]=9 < 10 → l=4
Цикл завершён (l=4, r=5)

Результат: l = 4 (элемент 9 — последний меньший 10)

Важные замечания

Попробовать бинарный поиск онлайн

Введите отсортированный массив и число x:

Результат появится здесь...