Двоичный (бинарный) поиск в упорядоченном массиве на языке C
Задача. Дан упорядоченный по возрастанию массив целых чисел. Вводится целочисленное значение. Определить, присутствует ли оно в массиве и в каком месте.
Пояснение. Поиск элемента в массиве можно выполнять последовательно: сначала сравнивать с искомым значением первый элемент, потом второй, третий и так далее. Однако для упорядоченных массивов более эффективен (в большинстве случаев потребуется меньше сравнений) метод деления пополам (бинарный, или двоичный, поиск). В этом случае поиск изначально выполняется только в левой или правой частях массива. На каждой итерации цикла "отрезок" поиска снова делится пополам. Подробнее алгоритм бинарного поиска описан в аналогичной задаче с решением на Python.
Решение задачи бинарного поиска на языке C:
#include <stdio.h> #define N 10 int main() { int a[N] = {-4, -2, 1, 4, 7, 10, 11, 15, 18, 22}; int n; short low = 0, high = N - 1, mid, isItem = 0; scanf("%d", &n); while (low <= high) { mid = (low + high) / 2; if (n < a[mid]) high = mid - 1; else if (n > a[mid]) low = mid + 1; else { printf("ID = %hd \n", mid); isItem = 1; break; } } if (isItem == 0) printf("Not found\n"); }
Примеры выполнения:
7 ID = 4
12 Not found