二分查詢 理論 例題

王ys發表於2024-11-16

遞迴程式碼

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

  

相關文章