第一种实现是以O(N3) 即以n的三次方实现的,这个算法很简单,想法特别明显
第二种以O(N2) 即以n的二次方实现,算法简单,但是仍然不够好
第三种 O(N*log(N)) ,以n乘以log(N),采取分治法解决问题,当然也采取了递归的思想。
第四种O(N),这个方法就无敌了,线性时间,如果数组是在磁盘或者磁带上面,只需要读取数组,不需要存储在内存上面(联机算法),此算法简洁高效,最理想的算法
5 int f1(int p[],int left,int right){
6 int tmp;
7 int
max_value=0;
8 for(int i = left;i <= right;i ++){
9
for(int j = i;j <= right;j ++){
10 tmp =0;
11
for(int k = i;k <= j;k ++){
12 tmp += p[k];
13
}
14 if(tmp >max_value){
15
max_value = tmp;
16 }
17 }
18 }
19
20 return max_value;
21 }
23 int f2(int p[],int left,int right){
24 int tmp=0;
25 int
max_value = 0;
26 for(int i =left;i <= right;i ++){
27
tmp = 0;
28 for(int j = left;j <= right;j ++){
29
tmp += p[j];
30 if(tmp > max_value)
31
max_value = tmp;
32 }
33 }
34 return max_value;
35 }
37 int f3(int p[],int left,int right){
38 int
left_max,right_max;
39 int return_left,return_right;
40 int
center,tmp;
41 if(left == right){
42 if(p[left] < 0)
43 return 0;
44 else
45 return
p[left];
46 }
47 center = (left + right) / 2;
48
return_left = f3(p,left,center);
49 return_right =
f3(p,center+1,right);
50 left_max = 0;
51 tmp = 0;
52
for(int i = center;i >= left;i--){
53 tmp += p[i];
54
if(tmp > left_max)
55 left_max = tmp;
56 }
57
58 right_max = 0;
59 tmp = 0;
60 for(int i = center+1;i
<= right;i ++){
61 tmp += p[i];
62 if(tmp >
right_max)
63 right_max = tmp;
64 }
65 if(return_left >
return_right){
66 if(return_left > (left_max + right_max) ){
67 return return_left;
68 }else{
69
return left_max + right_max;
70 }
71 }else{
72
if(return_right > (left_max + right_max) ){
73 return
return_right;
74 }else{
75 return left_max +
right_max;
76 }
77 }
78
79 }
82 int f4(int p[],int left,int right){
83 int tmp =0;
84 int
max_value = 0;
85 for(int i = left;i <= right;i ++){
86
tmp += p[i];
87 if(tmp < 0)
88 tmp = 0;
//it‘s means end the temp pos
89 else if(tmp > max_value)
90 max_value = tmp;
91 }
92 return max_value;
93
}
原文地址:http://www.cnblogs.com/ccccccccc/p/3754618.html