Двоичный поиск: алгоритм, примеры на C и Python, нюансы использования
Начинаем цикл статей, где можно будет простыми словами изучить алгоритмы.
Данный цикл полезен будет для подготовки к собесам и если вы хотите изучить базовые алгоритмы и структуры данных.
Будем рассматривать питон и Си.
А также сравнительный анализ этих языков для решения алгоритмических задач.
Двоичный поиск: алгоритм, примеры на C и Python, нюансы использования
- Что делать, если у вас отсортированный массив, и нужно быстро найти элемент?
- Правильный ответ: применить двоичный (бинарный) поиск.
- Он работает в логарифмическом времени: O(log₂ n).
- Это один из базовых, но при этом часто используемых алгоритмов в программировании.
Что такое двоичный поиск?
Представьте, что вы ищете слово в словаре. Вы не листаете по одной странице — вы раскрываете словарь в середине, смотрите, в каком направлении двигаться — и снова делите пополам.
Вот так же работает и двоичный поиск.


Пример на языке C
C:
#include <stdio.h>
int binary_search(int arr[], int size, int target) {
int left = 0, right = size - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (arr[mid] == target)
return mid; // нашли!
else if (arr[mid] < target)
left = mid + 1;
else
right = mid - 1;
}
return -1; // не найден
}
int main() {
int numbers[] = {3, 8, 15, 23, 42, 55, 60};
int index = binary_search(numbers, 7, 23);
if (index >= 0)
printf("Найдено на позиции %d\n", index);
else
printf("Элемент не найден\n");
return 0;
}
Почему ?
Код:
int mid = left + (right - left) / 2
Это защита от переполнения при сложении:
если left + right превысит INT_MAX, произойдёт integer overflow.
Вместо этого безопасно сначала вычислить (right - left) / 2 — это гарантированно меньше диапазона int, и только потом прибавить left.
А вот в питоне можно:
Код:
mid = (left + right) // 2
Здесь можно безопасно сложить left + right, потому что Python использует произвольную точность для целых чисел (big integers).
Также про это будет рассказано в следующих статьях.)

Python:
def binary_search(arr, target):
left, right = 0, len(arr) - 1
while left <= right:
mid = (left + right) // 2
if arr[mid] == target:
return mid # найден
elif arr[mid] < target:
left = mid + 1
else:
right = mid - 1
return -1 # не найден
nums = [3, 8, 15, 23, 42, 55, 60]
index = binary_search(nums, 23)
if index >= 0:
print(f"Найдено на позиции {index}")
else:
print("Элемент не найден")
C vs Python: нюансы реализации
C даёт полный контроль над памятью — придётся вручную считать границы, выделять массив, компилировать.
Python проще и нагляднее, особенно для обучения, но его скорость ниже.
На больших объёмах данных C покажет себя лучше по производительности.
Python же хорош как "скетчборд" — для прототипирования и отладки.
Временная сложность
Операция | Сложность |
---|---|
Лучший случай | O(1) – элемент в центре |
Средний случай | O(log n) |
Худший случай | O(log n) |
Почему важно понимать двоичный поиск?
- Он — основа многих алгоритмов, включая поиск в словарях, базах данных, деревьях.
- Работает везде, где есть отсортированные структуры.
- Часто используется на собеседованиях (Google, Яндекс, VK).
- Иногда возникает необходимость его модифицировать — например, найти первое вхождение.
Вариации и практики




Вывод
Если вы ещё не реализовали двоичный поиск "вручную" — сделайте это. На C, на Python, хоть на бумаге. Понимание этого простого, но мощного алгоритма — ключевой шаг к более сложным концепциям: деревьям, графам, индексированным поискам.
