二分查找 理论 例题






递归代码
int binary_search(int arr[],int left,int right,int key){
if (left>right){//区间无效
return -1;
}
int mid=left+(right-left)/2; //直接平均可能会溢出
if(arr[mid]==key){
return mid;
}else if(key>arr[mid]){
return binary_search(arr,mid+1,right,key); //右半区间继续查找
}
else{
return binary_search(arr,left,mid-1,key); //左半区间继续查找
}
}
循环代码
//代码中 arr 表示数组,left 表示区间左边界, right 表示区间右边界,mid 表示中间位置
int binary_search(int arr[],int left,int right,int key){
int ret=-1;//未搜索到数据返回-1
int mid;//中间位置
while(left<=right){//只要区间有效就继续
mid=left+(right-left)/2; //直接平均可能会溢出
if(arr[mid]==key){
ret=mid;//找到
break;
}
else if(key>arr[mid]){//右半区间继续查找
left=mid+1;
}
else{
right=mid-1; //左半区间继续查找
}
}
return ret; // 返回结果
}

1
#include<iostream>
using namespace std;
int main(){
int a[5]={1,2,2,3,4};
int n;
cin>>n;
int l=0,r=4;
int m;
while(l<=r){
m=l+(r-l)/2;
if(a[m]>=n){
r=m-1;
}else{
l=m+1;
}
if(a[l]==n){
cout<<l;
return 0;
}
}
cout<<-1;
}
2
#include<iostream>
using namespace std;
int main(){
int a[5]={1,2,2,3,4};
int n;
cin>>n;
int l=0,r=4;
int m;
while(l<=r){
m=l+(r-l)/2;
if(a[m]>n){
r=m-1;
}else{
l=m+1;
}
if(a[r]==n){
cout<<r;
return 0;
}
}
cout<<-1;
}
3
#include<iostream>
using namespace std;
int main(){
int a[9]={1,4,5,8,10,10,12,13,15};
int n;
cin>>n;
int l=0,r=8;
int m;
while(l<=r){
m=l+(r-l)/2;
if(a[m]>=n){
r=m-1;
}else{
l=m+1;
}
if(a[l]>=n){
cout<<l;
return 0;
}
}
cout<<-1;
}
4
#include<iostream>
using namespace std;
int main(){
int a[9]={1,4,5,8,10,10,12,13,15};
int n;
cin>>n;
int l=0,r=8;
int m;
while(l<=r){
m=l+(r-l)/2;
if(a[m]>n){
r=m-1;
}else{
l=m+1;
}
if(a[r]<=n){
cout<<r;
return 0;
}
}
cout<<-1;
}

浙公网安备 33010602011771号