您的位置:首页 > 其它

4、软件工程结对开发之求一维数组中连续最大子数组之和

2015-03-30 13:07 218 查看
一、题目:返回一个整数数组中最大子数组的和。
二、要求:
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大。
同时返回最大子数组的位置。
求所有子数组的和的最大值。 要求时间复杂度为O(n)。

三、设计思想

  在上次试验的基础上,利用动态数组,为了满足首尾相连,所以在计算一次之后,

要把该数放在数组的最后边,这样循环遍历,最后求得最大数组之和及他们所在的位置。

四、源代码

#include <iostream.h>
void Arr_Maxsum(int arr[],int length,int first,int last)
{
int count=0;
int result=arr[0];
int sum=arr[0];//初始化
for(int i=0;i<length;i++)
{
sum=0;
for(int j=i;j<length+i;j++)
{
sum+=arr[j];
if(sum>result)
{
result=sum;
first=i;
last=j;
}
}
arr[length+i]=arr[i];
}
if(last>=length)
{
cout<<"最大子数组起始位置为:"<<first+1<<endl;
cout<<"最大子数组终止位置为:"<<last-length+1<<endl;
}
else
{
cout<<"最大子数组起始位置为:"<<first+1<<endl;
cout<<"最大子数组终止位置为:"<<last+1<<endl;
}
cout<<"最大子数组为:"<<endl;
for(int m=first;m<=last;m++)
{
cout<<arr[m]<<"  ";
}
cout<<endl;
cout<<"最大子数组的和为:"<<endl;
cout<<result<<endl;
}
int main()
{
int num,length,first,last;
first=0;
last=0;
cout<<"请输入数组元素个数:";
cin>>length;//数组长度
num=2*length;
int* arr=new int[num];
cout<<"请输入数组数据:"<<endl;
for(int i=0;i<length;i++)
{
cin>>arr[i];
}
cout<<endl;
Arr_Maxsum(arr,length,first,last);
delete []arr;
return 0;
}


五、运行结果截图



六、实验总结

  本次试验刚开始的时候我们俩的设计思路还不太明确,想用链表实现,但链表的知识还都不太会,

经过一番讨论与思考决定还是利用上次的动态数组完成实现。在编程过程中的一些细节知识还把握的不好,

程序修改了很多次才能运行,我们俩都收获了宝贵的经验。

七、合作照片

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