二分查找其实就是在一段字符串或者数组中查找有没有自己想要的元素,如果按照常规方法一个一个去找那么很费时间,在多实例或者一个很长的字符串或者数组中查找有些时候很容易时间超限,所以这个时候二分查找是一个不错的方法。
二分查找既可以查找是否有某个元素,也可以去查找最接近元素或者大于某数的第一个元素,代码只是有一些小的变动,只要二分查找某个元素弄懂了,其他的也会差不多很好理解。
上代码:
#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;
}
所以如果是查找最接近的元素则只需要在出循环之后再比较一次就行。