我们已知的查找方式有枚举,排序查找等,但枚举时间耗时长,排序查找能找的过于单一,所以二分查找兼备了耗时少,运用广泛的特点,但缺点是数组必须从小到大或从大到小,我们可以与sort搭配来进行查找
也称折半查找。
假设我们有一个数组,1~n(n=100)
我们先猜中间数50,假设我们查的数大于50,那么我们猜75,反之猜25,以此类推。
而这种方法只需log(n)次
1、我们先定义一个长度为n的数组并给每项赋值,再输入我们要查的x
2、再定义l和r,将l设为1-1,r设为n+1(查找范围的边界)
3、我们之后用while来判断循环,如果l+1项小于r就循环
4、循环中找中间的位置(向下取整),如果中间项的值小于我们找的数,那么把l设为中间值反之设r为中间值,如果查找的数等于中间值,将答案设为中间的位置,跳出循环
int l = 0, r = n + 1; // 将l设为1 - 1,r设为n + 1
while(l + 1 < r){
int mid = (l + r) / 2;//中间位置公式:首位+末尾/2
if(a[mid] < x){//如果中间值小于查找的数
l = mid;//l设为中间位置
}
else if(a[mid] > x){//如果中间值大于查找的数
r = mid;//r设为中间位置
}
else{
ans = mid;
break;//记录答案并跳出循环
}
}
1、输入n和每一项,再输入查找的数x
2、用二分查找找出x在数组中的位置,注:答案要设成-1,因为如果找不到,那么输出-1
(只要会二分,这题纯水)
#include<bits/stdc++.h>
using namespace std;
long long a[1000005];
int main(){
long long x,n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
cin>>x;
long l=1-1,r=n+1,ans=-1;
while(l+1<r){
long long cnt=(l+r)/2;
if(a[cnt]>x){
r=cnt;
}else if(a[cnt]<x){
l=cnt;
}else{
ans=cnt;
break;
}
}
cout<<ans;
return 0;
}