二分法查找

注意:该方法只适用于按顺序排列的数组

二分法是一种在计算机中查找的方式

他的逻辑如下:

把函数f(x)的零点所在的区间[a,b](满足f(a)*f(b)<0)“一分为二”,得到[a,m]和[m,b]。根据“f(a)*f(m)<0”是否成立,取出零点所在的区间[a,m]或[m,b],仍记为[a,b]。所对得的区间[a,b]重复上述步骤,直到包含零点的区间[a,b]“足够小”,则[a,b]内的数可以作为方程的近似解。
 

下面用一个例子来详细讲解

现有一个数组{ -12, 0, 6, 16, 23, 56, 80, 100, 110, 115 } ,我们需要从这个数组中找出是否存在80这个数,若存在,则输出80的下标索引


第一步:

我们设置三个变量abc,分别放在数组首位,数组中间,数组末尾

 

然后查看我们的a,b,c是否指向我们想要的那个数,若没有指向到查找的那个数,则进行下一步操作


第二步:

若b在上一步指向的数比查找目标数小,则令a指向b,c不动,将b指向(a+c)/ 2的位置,再次查看a,b是否指向想要查找的数字,若不是,则进行下一步


第三步:

由于b指向100,比80大,则将c指向b原来所指的位置,a的位置不变,b指向(a+c)/ 2的位置, 

再次查看b,c是否指向查找数,发现b指向查找数,则返回b的值,也就是80的下标索引值

 


 用代码实现如下:

//二分法查找

#include <stdio.h>

int main()
{
	int arr[10] = { -12, 0, 6, 16, 23, 56, 80, 100, 110, 115 };
	int f = 0;
	int a = 0;
	int c = sizeof(arr) / sizeof(arr[0]) - 1;
	int b = (a + c) / 2;
	int found = 0;

	printf("请输入你要查找的数字\n");
	scanf("%d", &f);
	for (int i = 0; i < (sizeof(arr) / sizeof(arr[0])); i++)
	{
		if (arr[b] > f && b < c && b > a)
		{
			c = b - 1;
			int flag = c;
			b = (a + flag) / 2;
		}
		else if (arr[b] < f && b < c && b > a)
		{
			a = b + 1;
			int flag = a;
			b = (flag + c) / 2;
		}
		else if (arr[b] == f)
		{
			printf("找到了!下标是%d", b);
			found = 1;
			break;
		}
		else if (arr[c] == f)
		{
			printf("找到了!下标是%d", c);
			found = 1;
			break;
		}
		else if (arr[a] == f)
		{
			printf("找到了!下标是%d", a);
			found = 1;
			break;
		}
		else if(a == b || b == c)
		{
			printf("找不到该数");
			break;
		}
	}
	return 0;
}

值得一提的是:

        当该数组没有目标元素时的判断条件为a == b或者b ==c

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值