分而治之——二分查找
2017-09-07 16:01
99 查看
递归版本1:
递归版本2:
i
不将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;
}
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;
}
相关文章推荐
- 二分查找
- C++之二分查找
- 二分查找的几点思考
- PHP:冒泡排序、快速查找和二分查找的思路以及算法
- 查找算法集:顺序查找、二分查找、插值查找、动态查找(数组实现、链表实现,附代码)
- 二分查找的两种正确实现
- java数组中二分查找Demo范例
- 枚举、递归和二分查找
- JAVA查找--[二分查找]
- codeforces 676C Vasya and String 前缀数组+二分查找
- SDUT-3376 数据结构实验之查找四:二分查找
- P - M--二分查找
- 【2015ZUFE新生赛网络同步赛M】【DP 打表 二分】GW I (3) 暴力预处理+分类打表二分查找
- C语言:顺序查找和二分查找
- 排序数组内的查找——二分查找
- 分治专题(二分查找与快速幂)
- 冒泡排序和二分查找
- 练习 2.3-5 二分查找
- 二分查找
- 二分查找(vijos1450包裹快递)