Двоичный поиск (Керниган-Ритчи, упр. 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.