1.寻找单个元素的准确下标
思路:主要是将区间段中二分之一的值与目标值进行比较,然后慢慢缩小区间,直至寻到目标值。
注意:此处所指的二分之一指的是数组下标,而比较的却是数组中的值。
eg: 给定一个数组和目标值,运用二分查找,若找到,则输出它所在 的位置;未找到,就输出-1;
#include<stdio.h>
int a[10]= {0,1,2,3,4,5,6,7,8,9};
int main()
{
int t,l=0,r=9,mid=0,ans=0; //r,l 分别代表数组的左右两端
scanf("%d",&t); //给定一个目标值
while(l<=r) //进行循环,结束条件是当区间缩减到只有那个数时
{
mid=(l+r)/2; //下标的中间值
if(a[mid]>t) //将中间值与目标值作比较
r=mid-1; //如果小于,就说明目标值在中间值的左边,因此将右界限改变
else if(a[mid]<t) //同理,大于目标值,就将左边界改变
l=mid+1;
else
{
ans=mid; //直至寻找到目标值,终止循环
break;
}
}
printf("%d",ans);
}
2.寻找一个元素在数组中的初始位置和结束位置
#include<stdio.h>
int a[10]= {1,1,1,2,3,3,4,5,6,6}; //数组元素
int main() {
int n;
scanf("%d",&n); //输入一个可查询的数
int r,l,s=0,e=9,mid=0;
while(s<=e) { //寻找元素左边界
mid=(s+e)/2; //依然是中间值比较
if(a[mid]>=n) //即使寻找到n时,也继续比较,不停止
e=mid-1;
else
s=mid+1; //终止条件,当寻找到左边界时,才会出循环
}
l=s,s=0,e=9; //赋值,左边界;同时归零,回到初始状态
while(s<=e) { //寻找右边界,理解同上
mid=(s+e)/2;
if(a[mid]<=n)
s=mid+1;
else
e=mid-1;
}
r=e;
printf("%d %d\n",l,r);//输出即可
}
_ 同是用二分查找的方法进行,这个里面用了两次,分别寻找左右边界。
与案例一不同的是,案例一中寻找到所需要的值即可跳出循环;但是,案例二中不同的是,即使寻找到了,也不停止,直至寻找到边界为止,(可见代码中的>=和<=)。
此时,循环会执行到左边界左边的值和右边界右边的值,就会跳出循环,输出就找到啦 _