您的位置:首页 > 编程语言 > C语言/C++

最大子数组问题-c++代码实现及运行实例结果

2017-12-15 11:31 856 查看
问题描述:假定你获得了投资挥发性化学公司的机会。给出一支股票17天价格表,要求求出买进卖出获得的最大化收益及买进时刻卖出时刻.......详见算法导论第三版

伪代码







c++代码

#include <iostream>

using namespace std;

/*数组需要下标,定义结构体*/
class Array
{
private:
public:
int indexLow;
int indexHigh;
int arraySum;
};

Array findMaxSubArray(int array[],int low,int high);
Array findMaxArray(Array L,Array R,Array M);

int main()
{
int A[]={ 2, 1,-6, 5,-9, 7, 3, 4,-5, 8, 6};
int length=sizeof(A)/sizeof(A[0]);
cout<<"输入的数组为:"<<endl;
for(int i=0;i<length;++i)
cout<<A[i]<<" ";
cout<<endl;
Array result=findMaxSubArray(A,0,length-1);
cout<<"最大子数组下标左值:"<<result.indexLow<<endl<<"最大子数组下标右值:"<<
result.indexHigh<<endl<<"最大子数组和:"<<result.arraySum<<endl;
return 0;
}

Array findMaxSubArray(int array[],int low,int high)
{
Array leftSubArray,middleSubArray,rightSubArray;//定义三个数组
int indexLowTemp,indexHighTemp;//定义下标
int leftSubArrayTemp=0;//定义左边数组
int rightSubArrayTemp=0;
int mLeftSum=0;//定义中间量往左走的数组和
int mRightSum=0;
int middle=(low+high)/2;
/*递归结束条件,数组只有一个数时*/
if(low==high)
{
Array result;
result.indexLow=low;
result.indexHigh=high;
result.arraySum=array[high];
return result;
}
/*数组数大于等于2时*/
leftSubArray=findMaxSubArray(array,low,middle);//递归
rightSubArray=findMaxSubArray(array,middle+1,high);
for(int i=middle;i>=low;--i)
{
leftSubArrayTemp=leftSubArrayTemp+array[i];
if(leftSubArrayTemp>mLeftSum)
{
mLeftSum=leftSubArrayTemp;
indexLowTemp=i;
}
}
for(int j=middle+1;j<=high;++j)
{
rightSubArrayTemp=rightSubArrayTemp+array[j];
if(rightSubArrayTemp>mRightSum)
{
mRightSum=rightSubArrayTemp;
indexHighTemp=j;
}
}
middleSubArray.indexLow=indexLowTemp;
middleSubArray.indexHigh=indexHighTemp;
middleSubArray.arraySum=mLeftSum+mRightSum;//左边子数组加上右边子数组
return findMaxArray(leftSubArray,middleSubArray,rightSubArray);//找到三个数组中的最大那一个
}

Array findMaxArray(Array L,Array M,Array R)
{
Array max;
max=L;
if(max.arraySum<M.arraySum)
max=M;
if(max.arraySum<R.arraySum)
max=R;
return max;
}


运行结果

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: