ch2算法习题
1.将二分搜索写成递归的实例:
源代码:(不太会使用类模板和vector的说,5555)
template<typename Comparable>
int binarysearh(const vector< Comparable> & a,const Comparable &x)
{
int low=0,high=a.size()-1;
while(low<=high)
{
int mid = (low+high)/2;
if(a[mid]<x)
low=mid+1;
else if(a[mid]>x)
high=mud-1;
else
return mid;
}
return NOT_FOUND;
}
#include<iostream>
using namespace std;int binarysearch(int a[],int left,int right,const int &x)
{
if(left>right)
{
cout<<"Not Found !"<<endl;
return 0;
}
int center = (left+right)/2;
if(a[center]<x)
left=center+1;
else if(a[center]>x)
right=center-1;
else return center;//返回找到数的下标
return binarysearch(a,left,right,x);
}
int main()
{
int b[10]={0,4,5,7,9,12,16,17,19,21};
int m,left,right;
left=0;
right=9;
m=binarysearch(b,left,right,9);
cout<<m<<endl;
return 0;
}
2.对最大子序列求和的算法问题需要返回最大值与具体序列的下标
算法3:对于一个函数返回多个变量问题的处理,直接在外部定义全局变量或者定义数组打印输出
#include<iostream>
using namespace std;
void display(int a,int b)
{
cout<<"the start point is :"<<a<<endl;
cout<<"the end point is :"<<b<<endl;
}
int maxsumrec(int a[],int left,int right)
{
if(left==right)//base case
if(a[left]>0)
return a[left];
else
return 0;
int center =(left+right)/2;
int start,end,sum;//标志开始位
int maxleftsum = maxsumrec(a,left,center);
int maxrightsum = maxsumrec(a,center+1,right);
int maxleftbordersum = 0,leftbordersum = 0;
for(int i = center;i >= left;i --)
{
leftbordersum += a[i];
if(leftbordersum > maxleftbordersum)
{
maxleftbordersum = leftbordersum;
start = i;
}
}
int maxrightbordersum = 0,rightbordersum = 0;
for(int j = center+1;j <= right;j ++)
{
rightbordersum += a[j];
if(rightbordersum > maxrightbordersum)
{
maxrightbordersum = rightbordersum;
end = j;
}
}
sum = maxleftbordersum+maxrightbordersum;
display(start,end);
return sum;
}
int main()
{
int a[11]={-1,-3,4,7,5,1,-8,9,10,3,-11};
cout<<maxsumrec(a,0,10)<<endl;
return 0;
}
算法4:运行时间复杂度最小
#include<iostream>
using namespace std;
int start=0,end=0;
int maxsum(int a[])
{
int maxsum = 0,this_sum = 0;
for(int j = 0;j < 10;j ++)
{
this_sum += a[j];
if(this_sum > maxsum)
{
maxsum = this_sum;
end = j;
}
else if(this_sum<0)
{
this_sum = 0;
start=j+1;
}
}
return maxsum;
}
int main()
{
int a[11]={-1,-3,4,7,5,1,-8,9,10,3,-11};
cout<<"maxsum :"<<maxsum(a)<<endl;
cout<<"start :"<<start<<endl;
cout<<"end :"<<end<<endl;
return 0;
}
vector实例一:
#include<vector>
#include<iostream>
using namespace std;
int main()
{
vector<int>v;
for(int i = 0;i < 10;i ++)
{
v.push_back(i);
}
for(i = 0;i < 10;i ++)
cout<<v[i]<<endl;
return 0;
}