数据结构与算法分析的C++描述结构学习(2)

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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值