forked from pratyushmp/code_opensource_2020
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMax sub-array.c
More file actions
109 lines (88 loc) · 2.19 KB
/
Copy pathMax sub-array.c
File metadata and controls
109 lines (88 loc) · 2.19 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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#include<stdio.h>
#include<stdlib.h>
#include<limits.h>
typedef struct subarray
{
int low, high, sum;
}subarray;
subarray left, right, cross, s;
subarray max_crossing_subarray(int a[], int low, int mid, int high)
{
int sum,i,j,leftsum,rightsum;
sum = 0;
leftsum = INT_MIN;
for(i=mid; i>=low; i--)
{
sum = sum + a[i];
if(sum > leftsum)
{
leftsum = sum;
s.low = i;
}
}
sum = 0;
rightsum = INT_MIN;
for(j=mid+1; j<=high; j++)
{
sum = sum + a[j];
if(sum > rightsum)
{
rightsum = sum;
s.high = j;
}
}
s.sum = leftsum + rightsum;
return s;
}
subarray max_subarray(int a[], int low, int high)
{
if(low==high)
{
s.low = low;
s.high = high;
s.sum = a[low];
return s;
}
else
{
int mid = (low+high)/2;
left = max_subarray(a, low, mid);
right = max_subarray(a, mid+1, high);
cross = max_crossing_subarray(a, low, mid, high);
if(left.sum >= right.sum && left.sum >= cross.sum)
{
s.low = left.low;
s.high = left.high;
s.sum = left.sum;
}
else if(right.sum >= left.sum && right.sum >= cross.sum)
{
s.low = right.low;
s.high = right.high;
s.sum = right.sum;
}
else
{
s.low = cross.low;
s.high = cross.high;
s.sum = cross.sum;
}
return s;
}
}
void main()
{
subarray s;
int a[] = {13,-3,-25,20,-3,-16,-23,18,20,-7,12,-5,-22,15,-4,7};
int i, low=0, high=(sizeof(a)/sizeof(a[0]))-1;
s = max_subarray(a, low, high);
printf("~The array elements are: ");
for(i=low; i<=high; i++)
printf("%d ", a[i]);
printf("\n\n~Maximum subarray is from index = %d to %d", s.low, s.high);
printf("\n~Maximum subarray sum = %d", s.sum);
printf("\n~Maximum subarray elements: ");
for(i=s.low; i<=s.high; i++)
printf("%d ", a[i]);
printf("\n");
}