二分查找(查找下标以及初始结束位置)

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);//输出即可
}

_ 同是用二分查找的方法进行,这个里面用了两次,分别寻找左右边界。
与案例一不同的是,案例一中寻找到所需要的值即可跳出循环;但是,案例二中不同的是,即使寻找到了,也不停止,直至寻找到边界为止,(可见代码中的>=和<=)。
此时,循环会执行到左边界左边的值和右边界右边的值,就会跳出循环,输出就找到啦 _

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值