折半查找法

折半查找法,又叫二分查找法,是一种查找算法。
该算法只能查找具有单调性(单增或者单减)的一组数列。
代码如下:

循环法:

#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); //递归
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值