Последовательность инструкций
Основное действие, выполняемое на каждом шаге поиска, — сравнение значения x (меньше, больше или равно) с элементом v[mid]; это сравнение естественно поручить конструкции else-if.
if (выражение)
инструкция
else if (выражение)
инструкция
else if (выражение)
инструкция
else if (выражение)
инструкция
else
инструкция
самый общий способ описания многоступенчатого принятия решения. Выражения вычисляются по порядку; как только встречается выражение со значением "истина", выполняется соответствующая ему инструкция; на этом последовательность проверок завершается. Здесь под словом инструкция имеется в виду либо одна инструкция, либо группа инструкций в фигурных скобках.
Последняя else-часть срабатывает, если не выполняются все предыдущие условия. Иногда в последней части не требуется производить никаких действий, в этом случае фрагмент
else
инструкция
можно опустить или использовать для фиксации ошибочной ("невозможной") ситуации.
В качестве иллюстрации трехпутевого ветвления авторы книги предлагают рассмотреть функцию бинарного поиска значения x в массиве v. Предполагается, что элементы v упорядочены по возрастанию. Функция выдает положение x в v (число в пределах от 0 до n-1 ), если x там встречается, и -1 , если его нет.
При бинарном поиске значение x сначала сравнивается с элементом, занимающим серединное положение в массиве v. Если x меньше, чем это значение, то областью поиска становится "верхняя" половина массива v, в противном случае — "нижняя". В любом случае следующий шаг — это сравнение с серединным элементом отобранной половины. Процесс "уполовинивания" диапазона продолжается до тех пор, пока либо не будет найдено значение, либо не станет пустым диапазон поиска.
int binsearch(int x, int v[], int n);
int main(void)
{
int index = 10;
int arr[10] = { 1, 3, 4, 7, 15, 18, 33, 34, 67, 88 }; /* упорядоченный по возрастанию массив из 10 элементов */
int pos; /* позиция искомого значения в массиве */
int el = 7; /* искомое значение */
pos = binsearch(el, arr, index);
printf("Значение %d имеет индекс %d\n", el, pos);
return 0;
}
/* binsearch: найти x в v[0] <= v[1] <= ... <= v[n-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; /* совпадения нет */
}
$ vim binsearch.c#include <stdio.h>
int binsearch(int x, int v[], int n);
int main(void)
{
int index = 10;
int arr[10] = { 1, 3, 4, 7, 15, 18, 33, 34, 67, 88 }; /* упорядоченный по возрастанию массив из 10 элементов */
int pos; /* позиция искомого значения в массиве */
int el = 7; /* искомое значение */
pos = binsearch(el, arr, index);
printf("Значение %d имеет индекс %d\n", el, pos);
return 0;
}
/* binsearch: найти x в v[0] <= v[1] <= ... <= v[n-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; /* совпадения нет */
}
$ cc -g -O0 -Wall -o a.out binsearch.c
$ ./a.out
Значение 7 имеет индекс 3
Основное действие, выполняемое на каждом шаге поиска, — сравнение значения x (меньше, больше или равно) с элементом v[mid]; это сравнение естественно поручить конструкции else-if.
Комментариев нет:
Отправить комментарий