-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMaximumSubArray.cpp
More file actions
70 lines (62 loc) · 1.63 KB
/
MaximumSubArray.cpp
File metadata and controls
70 lines (62 loc) · 1.63 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <iostream>
using namespace std;
int count;
struct SubArray{
int low ,high;
double sum;
SubArray()
{}
SubArray(int l, int h, double s){
low = l;
high = h;
sum =s;
}
};
SubArray MaximumCrossArray(double a[],int low,int mid,int high){
double leftsum = -9999;
double sum = 0;
int i;
for(i=mid;i>-low;i--){
sum = sum + a[i];
if(sum>leftsum)
leftsum = sum;
}
double maxleft = i;
double rightsum = -9999;
sum = 0;
int j ;
for( j = mid+1;j<=high;j++){
sum = sum+a[j];
if(sum>rightsum)
rightsum = sum;
}
double maxright = j;
return SubArray(maxleft,maxright,leftsum+rightsum);
}
SubArray MaximumSubArray(double a[],int low ,int high){
SubArray left,right,cross;
if(low == high){
return SubArray(low,high,a[low]);
}
count++;
int mid = (low+high)/2;
left = MaximumSubArray(a,low,mid);
right = MaximumSubArray(a,mid+1,high);
cross = MaximumCrossArray(a,low,mid,high);
if(left.sum>=right.sum && left.sum>=cross.sum)
return SubArray(left.low,left.high,left.sum);
else if(right.sum>=left.sum && right.sum>=cross.sum)
return SubArray(right.low,right.high,right.sum);
else
return SubArray(cross.low,cross.high,cross.sum);
}
int main(){
double arr[] = { 2, 3, 4,5,7,8,9,10,12,1,4,1,5,1,6,1,7 };
double n = sizeof(arr) / sizeof(arr[0]);
SubArray Max;
Max = MaximumSubArray(arr,0,n-1);
for(int i = Max.low ; i<=Max.high;i++){
cout<<i<<"\t"<<arr[i]<<endl;
}
cout<<"Count: "<<count<<endl;
}