首先明白什么是二分查找。
二分查找,顾名思义,就是不断将一段数据进行二分然后得到需要的那个数字。
通过变量left(左) right(右) 以及mid(中)来确定每个需要查找的区域。
那么,什么时候需要用到二分查找呢?
二分查找用的环境在哪呢?
首先用二分查找的必须条件就是这段数据必须要是以从大到小,或者从小到大的顺序进行排列!
然后才能进行二分模板。
举个例子:有三个数字 1 2 3,找到2的位置。
这三个数字就是按照从小到大的顺序进行排列的,因此能够使用二分查找。
话不多说,直接上代码!
#include<iostream>
using namespace std;
int main (){
int f=-1;
int a[100];
int n;
cin>>n;
int left=1,right=n;
int mid=(left+right)/2;
for(int i=1;i<=n;i++){
cin>>a[i];
}
int key;
cin>>key;
while(left<=right){
if(key==a[mid]){
f=mid;
break;
}
if(key<a[mid]) right=mid-1;
if(key>a[mid]) left=mid+1;
}
if(f==-1){
cout<<"no";
}
else {
cout<<f<<endl;
}
}
每次a【mid】要与key(你想要得到的数字)的大小进行比较。
如果a[mid]比key大,那么将执行操作 left=mid+1;什么意思呢?意思就是将left原来的位置进行移动,因为key比a[mid]大,因此我们将查找区间变为mid之后的位置。
看图(doge)
L'就是变换的位置。
如果a[mid]比key小,也就是key在a[mid的左边,]那么则执行right=mid-1,原理同上。
以上就是通过循环来进行二分查找。
还有一种就就是递归来进行递归查找。
原理跟上面一样,只是写法不同,就不再说明。
#include<iostream>
using namespace std;
int a[100];
int erfen (int left,int right,int key){
if(left<=right){
int mid=(left+right)/2;
if(key==a[mid]) return mid;
if(key<a[mid]) return erfen(left,mid-1,key);
if(key>a[mid]) return erfen(mid+1,right,key);
}
else{
return 0;
}
}
int main (){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
int key;
cin>>key;
cout<<erfen(1,n,key);
}
就是这样喵。