关于二分查找

二分查找其实就是在一段字符串或者数组中查找有没有自己想要的元素,如果按照常规方法一个一个去找那么很费时间,在多实例或者一个很长的字符串或者数组中查找有些时候很容易时间超限,所以这个时候二分查找是一个不错的方法。

二分查找既可以查找是否有某个元素,也可以去查找最接近元素或者大于某数的第一个元素,代码只是有一些小的变动,只要二分查找某个元素弄懂了,其他的也会差不多很好理解。

上代码:

#include<stdio.h>
#include<algorithm>
using namespace std;
int main(void)
{
	int a,b,c,r,l,rans,i,mid;
	scanf("%d",&a);
	int o[a];

	for(i=0; i<a; i++)//输入数组
		scanf("%d",&o[i]);

	sort(o,o+a);//使用二分查找数组必须是有序的,否则无法实现。

	scanf("%d",&c);//输入要查找的元素

	l=0,r=a-1,rans=-1;//l为最左端下标,r为最右端下标。
	while(l<=r)//当l移动到r右侧结束
	{
		mid=(l+r)/2;//二分查找精髓就是每一次都在长度一半的位置比较
		if(o[mid]==c)//查找到元素就结束
		{
			rans=mid;
			break;
		}
		else if(o[mid]>c)//一半的位置元素比c大说明该元素在c左侧,反之则在右侧。
			r=mid-1;//移动r或l代表将不符合情况的段落摘除
		else
			l=mid+1;
	}
	if(rans!=-1)//出循环之后如果rans值变了说明查找到了该元素,反之则没有查找到。
		printf("Yes\n");
	else
		printf("No\n");
/*
如果没有查找到该元素,在结束的时候该元素就在o[r]和o[l]之间,l已经移动到r右测了,所以o[r]是小于该元素的第一个,o[l]是大于该元素的第一个。
当然还有特殊情况,就是该元素比数组第一个元素小,或者是该元素比数组最后一个大。要分开说明。
*/
	return 0;
}

 所以如果是查找最接近的元素则只需要在出循环之后再比较一次就行。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值