数组02

一、题目:返回一个整数数组中最大子数组的和。

二、要求:输入一个整形数组,数组里有正数也有负数。 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。

  如果数组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的信心。

posted on 2016-03-27 18:57  浩特  阅读(341)  评论(1编辑  收藏  举报

导航