二分查找 理论 例题

 

 

 

 

 

递归代码

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;
}

  

posted @ 2024-11-16 09:59  王ys  阅读(4)  评论(0编辑  收藏  举报