Напишите версию функции с одной проверкой внутри цикла - C (СИ)
Формулировка задачи:
Керниган и Ритчи "Язык программирования C". Упражнение 3.1
В этом двоичном поиске каждый цикл содержит две проверки, тогда как достаточно было бы одной (зато взамен их потребовалось бы больше снаружи цикла). Напишите версию функции с одной проверкой внутри цикла.
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;
}Решение задачи: «Напишите версию функции с одной проверкой внутри цикла»
textual
Листинг программы
int binsearch (int x, int v[], int n){
int low, high, mid;
for( low = 0, high = n-1, mid = (low+high)/2;
( v[mid]!=x ) && ( low < high ); mid = (low+high)/2 )
{
if (x < v[mid]){
high = mid - 1;
}else{
low = mid +1;
}
}
return mid;
}
int main(){
int nArr[] = {0,1,2,3,4,5,6,7,8,9}, i;
printf( "%d\n", binsearch( 5, nArr, sizeof(nArr)/sizeof(int) ) );
return 0;
}
Объяснение кода листинга программы
- В функции
binsearchобъявлены три переменные типаint:low,highиmid. Значение переменнойmidинициализируется в первой итерации цикла. - Далее в цикле, пока условие
( v[mid]!=x ) && ( low < high )истинно, выполняется следующая часть кода: - Если
xменьше значения в индексеmidв массивеv, то значение переменнойhighуменьшается на единицу, чтобы в следующем шаге уменьшить область поиска. - Если
xбольше или равно значению в индексеmid, то значение переменнойlowувеличивается на единицу, чтобы в следующем шаге увеличить область поиска. - После каждой итерации значение переменной
midобновляется в соответствии с формулой(low+high)/2. - Когда условие
( v[mid]!=x ) && ( low < high )становится ложным, выполняется последняя часть кода внутри цикла: - Значение переменной
midвозвращается из функции как результат. - В функции
mainобъявлен массивnArrтипаintс десятью элементами от 0 до 9. - Функция
binsearchвызывается с аргументами 5, nArr иsizeof(nArr)/sizeof(int). - Результат работы функции
binsearchвыводится на экран с помощью функцииprintf. - Функция
mainвозвращает 0, чтобы указать, что программа успешно завершилась.