一、题目:返回一个整数数组中最大子数组的和。
二、要求:输入一个整形数组,数组里有正数也有负数。 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大。
同时返回最大子数组的位置。 求所有子数组的和的最大值。
三、设计思想
在上一次实验的基础上,利用动态数组,为满足首尾相连,在计算一次之后,要把该数放在数组的最后边,这样循环遍历,最后求得最大数组之和及数组数值所在的位置。在定义数组array时,使用了指针的动态空间申请,以此来储存数组中的元素,并在最后释放了申请的空间,避免资源浪费。
四、源代码
1 //数组02 2 //胡浩特、朱子嘉 2016/3/27 3 4 #include <iostream> 5 using namespace std; 6 7 void Arr_Maxsum(int arr[], int length, int first, int last) 8 { 9 int count = 0; 10 int result = arr[0]; 11 int sum = arr[0];//初始化 12 for (int i = 0; i<length; i++) 13 { 14 sum = 0; 15 for (int j = i; j<length + i; j++) 16 { 17 sum += arr[j]; 18 if (sum>result) 19 { 20 result = sum; 21 first = i; 22 last = j; 23 } 24 } 25 arr[length + i] = arr[i]; 26 } 27 if (last >= length) 28 { 29 cout << "最大子数组起始位置为:" << first + 1 << endl; 30 cout << "最大子数组终止位置为:" << last - length + 1 << endl; 31 } 32 else 33 { 34 cout << "最大子数组起始位置为:" << first + 1 << endl; 35 cout << "最大子数组终止位置为:" << last + 1 << endl; 36 } 37 cout << "最大子数组为:" << endl; 38 for (int m = first; m <= last; m++) 39 { 40 cout << arr[m] << " "; 41 } 42 cout << endl; 43 cout << "最大子数组的和为:" << endl; 44 cout << result << endl; 45 } 46 int main() 47 { 48 int num, length, first, last; 49 first = 0; 50 last = 0; 51 cout << "请输入数组元素个数:"; 52 cin >> length;//数组长度 53 num = 2 * length; 54 int * arr = new int [num];//申请空间 55 cout << "请输入数组数据:" << endl; 56 for (int i = 0; i<length; i++) 57 { 58 cin >> arr[i]; 59 } 60 cout << endl; 61 Arr_Maxsum(arr, length, first, last); 62 delete [] arr;//释放空间 63 return 0; 64 }
五、实验结果
六、实验总结
本次实验刚开始的时候设计思路还不太明确,想使用链表的方法实现,但是对数据结构中的链表知识掌握不太牢固,不知道如何使用,后来,经过一番讨论与思考决定还是利用上次的动态数组完成实现。在编程过程中的一些细节知识还把握的不好,浪费了一定的时间:思考如何将链式的数组转化成为环式的数组,然后再看成链式的数组,来查找最大子数组,算法修改了很多次后才完成了实验的要求,通过本次实验我们俩都收获了宝贵的经验,也增强了自己对于coding的信心。