注意:该方法只适用于按顺序排列的数组
二分法是一种在计算机中查找的方式
他的逻辑如下:
把函数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