5 классических ловушек при реализации бинарного поиска
Бинарный поиск — алгоритм, который все считают простым. Но именно в нём разработчики (включая опытных!) чаще всего делают незаметные ошибки, которые проявляются только при граничных случаях.

- Разберём типичные баги
- Покажем примеры на C и Python
- Поймём, почему в алгоритме «из трёх строк» столько нюансов
❶ Переполнение при вычислении середины в C
C:
// ⚠️ Ошибочный способ:
int mid = (left + right) / 2;
Если
left
и right
большие (например, 2 000 000 000), произойдёт переполнение int, и mid станет отрицательным. Это сложно отследить.
C:
int mid = left + (right - left) / 2;


Python:
mid = (left + right) // 2 # безопасно
❷ Бесконечный цикл при неправильно сдвинутых границах
Если забыть сдвигать
left
или right
, можно застрять в бесконечном цикле.
Python:
# ⚠️ Пример ошибки
while left < right:
mid = (left + right) // 2
if arr[mid] < target:
left = mid # ❌ не left + 1!
else:
right = mid

Python:
left = mid + 1 # если текущая середина точно меньше цели

left
, цикл может не завершиться.❸ Потеря значения при поиске первого/последнего вхождения
Если в массиве несколько одинаковых элементов, обычный бинарный поиск вернёт любой, но не обязательно первый.

Python:
left, right = 0, len(arr)
# Поиск первого вхождения
while left < right:
mid = (left + right) // 2
if arr[mid] < target:
left = mid + 1
else:
right = mid
После цикла
left
будет указывать на первый индекс, где встречается значение target
.Обратите внимание на отличие от binary_search, тут right = len(arr), а не len(arr) - 1, а также while left < right.
Это важно т.к.:
binary_search использует закрытый интервал [left, right].
- Оба конца включены.
- Проверка: while (left <= right)
- Подходит для поиска конкретного значения.
lower_bound использует полуоткрытый интервал [left, right)
- Правая граница не входит в диапазон.
- Проверка: while (left < right)
- Это позволяет корректно обрабатывать случай, когда элемент должен быть вставлен в конец массива.
❹ Выход за границы массива
Иногда встречается следующая ошибка:
C:
// ❌ доступ к arr[mid + 1] без проверки
if (arr[mid + 1] == target) { ... }
Если
mid == size - 1
, произойдёт выход за границы. Это undefined behavior и может привести к крашу или ошибкам только на определённых входах.
C:
if (mid + 1 < size && arr[mid + 1] == target)
❺ Неверное условие остановки цикла
Частая ошибка — неправильное условие
while
.
Python:
# ⚠️ Нестабильный вариант
while left <= right:
...
Это работает, но может быть трудно понять, что происходит на последних шагах.

left < right
и сохранением инварианта:
Python:
while left < right:
...
Подход
left < right
часто используют для поиска границ, особенно в задачах на бинарный поиск по функции (Binary Search on Answer
).
Вывод
- Бинарный поиск обманчиво прост — пока не столкнёшься с багами.
- Будь особенно осторожен с границами массива, сдвигом указателей и переполнением.
- На собеседованиях часто просят реализовать его с нуля на бумаге — с аккуратной логикой.

