K&R приводит программу для бинарного поиска и предлагает улучшить ее и сравнить результат. Прежде чем пробовать писать свою версию, попробовал сначала ту, что приводится в книге (раздел 3.3). В main написал свой код для проверки: создаю массив из 100 000 элементов, заполняю его числами от 0 до 99 999. Потом пробую найти индекс произвольного числа, например, 588. Все работает, но ... скучно, т.к. искомый индекс всегда совпадает с самим числом. Если число выходит из ранга, то возвращается -1, т.е. вроде бы все как нужно.
Пробую заполнить предварительно массив другими числами, например так (строка 10): arr[i] = i + 2
Запускаю, а программа зависает. Даже если перезапускаю терминал, то все равно глючит. Помогает лишь перезагрузка. Наверное, массивы и их индексация это тонкая материя, но пока не могу понять, в чем дело.
А вот вся программа:
#include <stdio.h>
/* binsearch: find x in v[0] <= v[0] <= ... <= v[n-1]; K&R version */
int binsearch (int, int [], int);
int main() {
int i;
int arr[100000];
for (i = 0; i < 100000; i++)
arr[i] = i;
printf("%d\n", binsearch(588, arr, 100000-1));
return 0;
}
/* binsearch */
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 /* found match */
return mid;
}
return -1; /* no match */
}