折半查找法,又叫二分查找法,是一种查找算法。
该算法只能查找具有单调性(单增或者单减)的一组数列。
代码如下:
循环法:
#include <stdio.h>
#define MAX_N 10000
int binary_search(int *arr, int n, int x) {
int head = 0, tail = n - 1, mid; //定义左起点,右终点,中点
while(head <= tail) {
mid = (head + tail) >> 1; //中间位置=首位相加除以2,也就是右移一位
if (arr[mid] == x) return mid + 1; //如果恰巧要找的数就在中点位置,那么返回这个位置(由于位置从0开始数,所以结果要+1)
if (arr[mid] < x) head = mid + 1; //由于数列单调,那么所求值大于中间位置的值,那么所求值应该在中间以右,故将左起点=中间位置+1
else tail = mid - 1; //同理,当所求值小于中间位置的值时,右终点-1
}
return -1; //如果找不到目标值,返回-1
}
int main() {
int n, x;
int numbers[MAX_N + 5] = {0};
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &numbers[i]);
}
while (~scanf("%d", &x)) {
printf("%d\n", binary_search(numbers, n, x));
}
return 0;
递归法:
int binary_search(int *arr, int l, int r, int x) {
if (l > r) return -1; //如果左起点大于右终点,说明目标不存在返回-1
int mid = (l + r) >> 1; //中间位置=首位相加除以2,也就是右移一位
if (arr[mid] == x) return mid + 1; //如果恰巧要找的数就在中点位置,那么返回这个位置(由于位置从0开始数,所以结果要+1)
if (arr[mid] < x) l = mid + 1; //由于数列单调,那么所求值大于中间位置的值,那么所求值应该在中间以右,故将左起点=中间位置+1
else r = mid - 1; //同理,当所求值小于中间位置的值时,右终点-1
return binary_search(arr, l, r, x); //递归
}