使用二分查找法的前提是,必须是排列好的、有顺序的数组。
例:
需在如下数组中,查找 2 和 5 这俩个数是否存在,若存在,则标出为第几位数?
1 4 5 7 9 10 11 14
代码如下:
#include<stdio.h>
int main()
{
int a[7]={1,4,5,7,9,11,14},x,t,low,high,mid;
int n;//n为需查找的数的个数
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&x);//x为需要查找的数
low=0;
high=7-1;
while(low<=high)
{
mid=(low+high)/2;
if(a[mid]==x)
{
t=mid;//t为查找的数的位数
break;//找到后跳出while循环
}
else if(a[mid]>x)
high=mid-1;
else
low=mid+1;
}
if(low>high)
printf("不存在\n");
else
printf("存在,它是第%d位数\n",t+1);
}
return 0;
}
过程演示:
若查找的数为2:
a[0] a[1] a[2] a[3] a[4] a[5] a[6]
1 4 5 7 9 11 14
low mid high
将2与mid进行比较,因为 2 < mid, 所以
a[0] a[1] a[2] a[3] | a[4] a[5] a[6]
1 4 5 7 | 9 11 14 后面这部分删除
low mid high
再将2与现在的mid进行比较,因为 2 < mid,所以
a[0] a[1] | a[2] a[3]
1 4 | 5 7 后面部分删掉
low high
mid
再将2与现在的mid进行比较,因为 2 > mid,所以
a[0] | a[1]
1 前面部分删掉 | 4
此时只剩下了一位数为 4 ,而 4!=2
故 2 在该数组中不存在。
若查找数为 5 ,以此类推。
结果如下: