Двоичный поиск (Керниган-Ритчи, упр. 3.1) - C (СИ)
Формулировка задачи:
Добрый день. Что-то я подвисла немного...
Поиском по форуму уже нашла, что такую задачу решали, но в предложенном решении проверка выносится за тело цикла только формально.
Есть ли какие-то другие варианты решения этой задачи?
Я попробовала покрутить, повертеть, но что-то ничего на ум не идет.
Задание:
В нашем двоичном поиске каждый цикл содержит две проверки, тогда как достаточно было бы одной (зато взамен их потребовалось бы больше снаружи цикла). Напишите версию функции с одной проверкой внутри цикла.int binsearch(int x, int v[], int n) { int low, high, mid; low=0; high=n-1; while (low<=high) { mid=(low+high)/2; if (x<v[mid]) high=mid-1; else if (x>v[mid]) low=mid+1; else return mid; } return -1; }
Решение задачи: «Двоичный поиск (Керниган-Ритчи, упр. 3.1)»
textual
Листинг программы
int BinarySearch(const int *a, const int n, const int x) { int l, r, mid; l = 0; r = n - 1; do { mid = (l + r) >> 1; if (a[mid] < x) l = mid + 1; else r = mid - 1; } while (l < r && a[mid] != x); if (a[l] == x) return l; else if (a[mid] == x) return mid; else return -1; }
Объяснение кода листинга программы
- В функции объявлены три аргумента:
a
,n
иx
. - Переменные
l
иr
инициализируются значениями 0 иn-1
соответственно. - Далее в цикле
do...while
происходит двоичный поиск. На каждой итерации значенияl
иr
обновляются, а значениеmid
становится серединным индексом междуl
иr
. - Если элемент в индексе
mid
меньше искомого значенияx
, то значениеl
обновляется наmid+1
. - Если элемент в индексе
mid
равен искомому значениюx
, то функция возвращает значениеmid
. - Если элемент в индексе
mid
больше искомого значенияx
, то значениеr
обновляется наmid-1
. - Если цикл завершается и значение
x
не найдено, то возвращается -1.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д