算法实验一 【二分查找】(分治算法)
二分查找采用分治策略,即将n个元素分为个数大致相同的两个部分,取a[n/2]与x进行比较,如果相同,返回yes,如果a[n/2]比x小,则在a[n/2]左半边进行同样方法的搜索;a[n/2]比x大时搜索方法相同。
代码如下
#include<iostream>
using namespace std;
int n,m,k;
int a[10000];
bool binarysearch(int a[],int k,int n);
int main()
{
int i;
cin>>n;
for(i=0;i<n;i++)
{
cin>>a[i];
}
cin>>m;
for(i=0;i<m;i++)
{
cin>>k;
if(binarysearch(a,k,n))
{
cout<<"Yes"<<endl;
}
else
{
cout<<"No"<<endl;
}
}
return 0;
}
bool binarysearch(int a[],int k,int n)
{
int left=0;
int right=n-1;
int middle;
while(left<=right)
{
middle=(left+right)/2;
if(k==a[middle]) return true;
else if(k<a[middle]) right=middle-1;
else left=middle+1;
}
return false;
}
2019.10.15
为复习算法重新写代码,结果一开始输入测例的时候完全没有反应,看了好多好多遍,完全没发现有什么错误,结果最后发现binarysearch函数里面把middle表示成(left+middle)/2了…要被自己蠢死了。
而且在判断时候,条件一定是left<=right,不能缺等号。否则当left或者right移到和被检测的值相同的数值上时就检测不出来了。