《子数组最大和》

(1)源代码:

 1 #include<iostream>
 2 using namespace std;
 3 #define N 10000
 4 
 5 int max(int a, int b)
 6 {
 7     int y;
 8     if (a > b&&b < 0)
 9     {
10         y = a;
11     }
12     if (a < b&&a < 0)
13     {
14         y = b;
15     }
16     if (a + b >= a&&a + b >= b)
17     {
18         y = a + b;
19     }
20     return y;
21 }
22 
23 int select(int a[], int l, int r)
24 {
25     int m = (r + l) / 2;
26     if (r == l)
27     {
28         return a[l];
29     }
30     int maxr = a[m+1], maxl = a[m];
31     int ml = a[m], mr = a[m + 1];
32     for (int i = m - 1; i >= l; i--)
33     {
34         ml = ml + a[i];
35         if (maxl <= ml)
36         {
37             maxl = ml;
38         }
39     }
40     for (int i = m + 2; i <= r; i++)
41     {
42         mr = mr + a[i];
43         if (maxr <= mr)
44         {
45             maxr = mr;
46         }
47     }
48     int e=select(a, l, m);
49     int z=select(a, m + 1, r);
50     int u=max(maxr, maxl);
51     if (u >= e&&u >= z)
52     {
53         return u;
54     }
55     if (e > z&&e > u)
56     {
57         return e;
58     }
59     if (z > e&&z > u)
60     {
61         return z;
62     }
63 }
64 int main()
65 {
66     int n, m, s , a[N];
67     cout << "请输入数组中有几个数字:";
68     cin >> s;
69     cout << "请输入数组中整数的范围(第一个数小于第二个数):";
70     cin >> n >> m;
71     for (int i = 0; i < s; i++)
72     {
73         a[i] = rand() % (m - n + 1) + n;
74         cout << a[i] << "   ";
75     }
76     cout << endl;
77     int p=select(a, 0, s-1);
78     cout << "子数组的最大和为" << p << endl;
79     return 0;
80 }

 

(2)运行截图:

 

 

(3)思路:

对于求子数组最大值有时间复杂度的要求,不能用两个for语句嵌套,我是用的递归算法,利用类似折半查找对元素进行相加并且进行比较,从而求出每个数组的子数组和为最大的值,再循环比较。

(4)

缺陷记录日志:

用时:90分钟,从3月23号11:00到12:30

        20分钟,从17:50到18:10对程序的不足进行改进

posted @ 2015-03-23 12:45  ruanjian1305  阅读(139)  评论(1)    收藏  举报