您的位置:首页 > 其它

分而治之——二分查找

2017-09-07 16:01 99 查看
递归版本1:
void binsearch(int n,int s[10],int x,int &location)
{
int low,hig,mid;
low=0;hign=9;
location=-1;
while(low<=hign&&location==-1)
{
mid=(low+hign)/2;
if(x==s[mid])
location=mid;
else if(x<s[mid])
hign=mid-1;
else
low=mid+1;
}
}


递归版本2:

i
nt location(int low,int hign)
{
int mid;
if(low>hign) return 0;
else{
mid=(low+hign)/2;
if(x==s[mid])
return mid;
else if(x>s[mid])
return location(mid+1,hign);
else
return location(low,mid-1);
}
}


不将n,s,x作为递归函数的参数,原因有二

1:减少递归例程表述的混乱程度

2:n,s,x在递归中并没有变化,递归式会产生副本,这种代价是高昂的。

递归版本2采用尾递归,尾递归函数的特点是在回归过程中不用做任何操作。

算法1比较2,可以节约大量内存,而且1不需要维护栈,执行速度更快(但只相差一个常量乘法因子)

算法分析:
W(n)=(lgn)(向下取整)+1∈Θ(lgn)

练习:

分治法求n项列表中的最大最小项include <iostream>
using namespace std;
void min_max(int a[],int i,int j,int &min,int &max)
{
int mid,max1,max2,min1,min2;
if(i==j)
{
max=a[i];
min=a[i];
return;
}
if(j==i+1)
{
if(a[i]>a[j])
{min=a[j];max=a[i];}
else
{min=a[i];max=a[j];}
}
else
{
mid=(i+j)/2;
min_max(a,i,mid,min1,max1);
min_max(a,mid+1,j,min2,max2);
if(min1>min2)
min=min2;
else min=min1;
if(max1>max2)
max=max1;
else max=max2;
}
}
int main()
{ int n,m,a[100],min,max;

cin>>m;
for(int i=1;i<=m;i++)
cin>>a[i];
min_max(a,1,m,min,max);
cout<<min<<' '<<max<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: