(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对程序的不足进行改进