二分查找的实现
- 二分查找可以由递归和递推实现
- 由递推实现:
int erfen(int a[],int traget,int n){
int left=0,right=n-1;
while(left<=right){
//带=号是left+1=right,不带是left=right
int mid=(left+right)/2;
//而是用 mid=low+((high-low)/2),原因是
//使用(low+high)/2会有整数溢出的问题
if(a[mid]==traget){
return mid;
}
else if(a[mid]<traget){
left=mid+1;
}
else if(a[mid]>traget){
right=mid-1;
}
}
return -1;
}
- 用递归实现
int indexOf(int list[] , int left, int right, int target) {
while (left <= right) {
int index = (left + right) / 2;
if(list[index] == target){
return index;
}else if (list[index] > target) {
return indexOf(list, left, index - 1, target);
} else if (list[index] < target) {
return indexOf(list, index + 1, right, target);
}
}
return -1;
}
3.还有c++已经封装好的函数upper_bound(),和lower_upper();
#include<bits/stdc++.h>
using namespace std;
int main(){
int a[9]={1,1,1,2,3,4,5,5,6};
//使用upper_bound 和 lower_bound 必须是已经排好序的递增的数组
sort(a,a+9);
int m=upper_bound(a,a+9,1)-a;
//返回值就是返回第一次出现大于那个要查找的数的地址
int n=lower_bound(a,a+9,1)-a;
//返回值就是返回第一次出现大于等于那个要查找的数的地址
//如果没找到就返回的是last位置
cout<<m<<endl;
cout<<n;
return 0;
//输出为3 0
}
例题:
洛谷的二分查找题:
#include<bits/stdc++.h>
#include<algorithm>
using namespace std;
int a[1000005];
int b[100005];
int main(){
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++){
cin>>a[i];
}
for(int i=0;i<m;i++){
cin>>b[i];
}
for(int i=0;i<m;i++){
int m=lower_bound(a,a+n,b[i])-a;
if(b[i]!=a[m]) cout<<-1<<" ";
else cout<<m+1<<" ";
}
return 0;
}```