最简单的二分查找

版权声明:都是自己写的喔~ https://blog.csdn.net/qq_42811706/article/details/89343322

二分法属于分治法的一种
对于已经从大到小排好序的数组,从键盘中读入一个数,查找数组中有没有和读入数据相同的,有则输出“yes”,没有则输出“no”
按照常规想法,循环数组一遍进行比较,当数组很大时效率低,采用二分,分而治之,讲大问题转化为小问题进行求解

递归方式实现
这里递归就是自身调用自身的方式

#include<iostream>
#include<algorithm>
using namespace std;
int a[105];
//递归实现 
void select(int x,int begin,int end)//三个参数为 要查找的数,查找范围的起点 查找范围的中点 
{
	if(begin>end)//如果范围无效 没有找到x 
	{
		cout<<"no"<<endl;
		return;
	}
	int mid=(begin+end)/2;//找到范围中间下标 
	if(a[mid]==x)//找到x 返回 
		cout<<"yes"<<endl;
	else if(a[mid]<x)//x在查找范围的右半部分 
	{
		select(x,mid+1,end);
	}
	else //在查找范围的左半部分 
	{
		select(x,begin,end);
	}
	return;
}
int main ()
{
	int n;
	cin>>n;//输入数据个数
	for(int i=0;i<n;i++)
		scanf("%d",&a[i]);
	sort(a,a+n);//对数据进行排序
	int m;
	cin>>m;
	select(m,0,n-1);//进行二分搜索 
	return 0;
} 

非递归实现

#include<iostream>
#include<algorithm>
using namespace std;
int a[105];
//非递归实现 
void select(int x,int begin,int end)//三个参数为 要查找的数,查找范围的起点 查找范围的中点 
{
	while(begin<=end)
	{
		int mid=(begin+end)/2;
		if(x==mid)
		{
			cout<<"yes"<<endl;
			return;
		}
		else if(x<mid)
		{
			end=mid-1;
		}
		else if(x>mid)
		{
			begin=mid+1;
		}
	}
	cout<<"no"<<endl;
	return;
}
int main ()
{
	int n;
	cin>>n;
	for(int i=0;i<n;i++)
		scanf("%d",&a[i]);
	sort(a,a+n);
	int m;
	cin>>m;
	select(m,0,n-1);//进行二分搜索 
	return 0;
} 

猜你喜欢

转载自blog.csdn.net/qq_42811706/article/details/89343322