-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrecursive-max-array.cpp
153 lines (122 loc) · 3.52 KB
/
recursive-max-array.cpp
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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
// Libraries to be added
#include <iostream>
#include <math.h>
#include <iomanip>
#include <cstdlib>
#include <chrono>
#include <time.h>
#include <fstream>
using namespace std;
// Struct to store values
struct subArray
{
int max_left;
int max_right;
int sum;
};
// Prototpyes
subArray FIND_MAX_CROSSING_SUBARRAY(int *A, int low, int mid, int high);
subArray FIND_MAX_SUBARRAY(int *A, int low, int high);
void RandomArray(int array[], int size);
int main()
{
int size;
cout << "Enter the Size of Array: ";
cin >> size;
int *A = new int[size];
// To generate random Numbers and store them
srand(time(NULL));
RandomArray(A, size);
// Code to call Recursive Max Array and measure time duration
subArray miniArr;
auto start = chrono::high_resolution_clock::now();
miniArr = FIND_MAX_SUBARRAY(A, 0, size - 1);
auto end = chrono::high_resolution_clock::now();
double time_taken = chrono::duration_cast<chrono::nanoseconds>(end - start).count();
// Code to calculate the time duration
time_taken *= 1e-9;
cout << "\nTime taken by the Recursive max array, with " << size << " size of Array is: ";
cout << fixed << time_taken << setprecision(9) << " seconds" << endl;
// Output of the SubArray
cout << "\nLeft Index is " << miniArr.max_left << endl;
cout << "Right Index is " << miniArr.max_right << endl;
cout << "Sum is " << miniArr.sum << endl;
// Code to Save array in csv file
ofstream OutData;
OutData.open("recursive-max-array.csv");
for (int i = 0; i < size; i++)
OutData << A[i] << endl;
delete[] A;
return 0;
}
// Recursive Max Sum Subarray
subArray FIND_MAX_SUBARRAY(int *A, int low, int high)
{
// if array has only one element
if (high == low)
{
subArray miniArray;
miniArray.max_left = low;
miniArray.max_right = high;
miniArray.sum = A[low];
return miniArray;
}
else
{
int mid = floor((high + low) / 2);
subArray leftArray;
subArray rightArray;
subArray crossArray;
leftArray = FIND_MAX_SUBARRAY(A, low, mid);
rightArray = FIND_MAX_SUBARRAY(A, mid + 1, high);
crossArray = FIND_MAX_CROSSING_SUBARRAY(A, low, mid, high);
if (leftArray.sum >= rightArray.sum && leftArray.sum >= crossArray.sum)
return leftArray;
else if (rightArray.sum >= leftArray.sum && rightArray.sum >= crossArray.sum)
return rightArray;
else
return crossArray;
}
}
// For cross Max Sum
subArray FIND_MAX_CROSSING_SUBARRAY(int *A, int low, int mid, int high)
{
int left_sum = A[mid], sum, max_left = mid;
sum = A[mid];
for (int i = mid - 1; i >= low; --i)
{
sum += A[i];
if (sum > left_sum)
{
left_sum = sum;
max_left = i;
}
}
sum = A[mid + 1];
int max_right = mid + 1, right_sum = A[mid + 1];
for (int j = mid + 2; j <= high; ++j)
{
sum += A[j];
if (sum > right_sum)
{
right_sum = sum;
max_right = j;
}
}
// Storing value in Struct
subArray miniArray;
miniArray.max_left = max_left;
miniArray.max_right = max_right;
miniArray.sum = left_sum + right_sum;
return miniArray;
}
// RandomArray Function to fill the array with random numbers
void RandomArray(int array[], int size)
{
for (int i = 0; i < size; i++)
{
array[i] = rand();
if (i % 2 == 0)
array[i] *= -1;
}
}