版权声明:都是自己写的喔~ 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;
}