1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
arr | 1 | 3 | 5 | 6 | 10 | 20 | 21 | 22 |
查找一个数字key=5的下标:
1.线性查找,时间复杂度为O(n),会超时
2.二分查找,时间复杂度为O(logn),注意数组arr一定单调
L=1,R=8,mid=(L+R)/2=4
第一步:比较arr[mid]=6>5,说明在arr[L]……arr[mid-1]中找,R=mid-1=3
第二步:更新mid=(L+R)/2=2,比较arr[mid]=3<5,说明要在arr[mid+1]……arr[R]中找,L=mid+1=3
第三步:更新mid=(L+R)/2=3,比较arr[mid]=5,5=key,查找结束,返回3
#include<bits/stdc++.h>
using namespace std;
const int N=1e5;
int arr[N];
int binarySearch(int arr[],int n,int x)
{
int l=1;
int r=n;
int ans=-1;
//二分查找
while(l<=r)
{
int mid=(l+r)/2;
if(arr[mid]==x)
{
ans=mid;
break;
}
if(arr[mid]<x)
{
l=mid+1;
}
else
{
r=mid-1;
}
}
return ans;
}
int main()
{
int n,key;
cin>>n;
cin>>key;
for(int i=1;i<=n;i++)
cin>>arr[i];
int ans=binarySearch(arr,n,key);
cout<<ans;
return 0;
}