Двоичный поиск: алгоритм, примеры на 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, хоть на бумаге. Понимание этого простого, но мощного алгоритма — ключевой шаг к более сложным концепциям: деревьям, графам, индексированным поискам.
	