Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit fc1efae

Browse files
committed
Export the max subarray algorithm
1 parent e0d1281 commit fc1efae

File tree

1 file changed

+62
-54
lines changed

1 file changed

+62
-54
lines changed
Lines changed: 62 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,67 +1,75 @@
11
/**
2-
* Finds the maximum subarray using the divide and conquer algorithm
2+
* Finds the maximum subarray using the divide and conquer algorithm
33
* by Bentley, Jon (1984) (complexity O(n(logn)));
44
*/
55

6-
/**
7-
* Accepts an array and range. Finds the maximum sum of elements
8-
* around the middle of the range.
9-
*
10-
* @param {array} array
11-
* @param {number} left - the left interval of the range
12-
* @param {number} middle - the middle of the range
13-
* @param {number} right - the right side of the range
14-
* @return {number} the maximum sum including the middle element
15-
*/
16-
function crossSubarray(array, left, middle, right) {
17-
var leftSum = -Infinity,
18-
rightSum = -Infinity,
19-
sum = 0,
20-
i;
6+
(function (exports) {
7+
8+
'use strict';
219

22-
for (i = middle; i >= left; i -= 1) {
23-
if (sum + array[i] >= leftSum) {
24-
leftSum = sum + array[i];
10+
/**
11+
* Accepts an array and range. Finds the maximum sum of elements
12+
* around the middle of the range.
13+
*
14+
* @param {array} array
15+
* @param {number} left - the left interval of the range
16+
* @param {number} middle - the middle of the range
17+
* @param {number} right - the right side of the range
18+
* @return {number} the maximum sum including the middle element
19+
*/
20+
function crossSubarray(array, left, middle, right) {
21+
var leftSum = -Infinity,
22+
rightSum = -Infinity,
23+
sum = 0,
24+
i;
25+
26+
for (i = middle; i >= left; i -= 1) {
27+
if (sum + array[i] >= leftSum) {
28+
leftSum = sum + array[i];
29+
}
30+
sum += array[i];
31+
}
32+
sum = 0;
33+
for (i = middle + 1; i < right; i += 1) {
34+
if (sum + array[i] >= rightSum) {
35+
rightSum = sum + array[i];
36+
}
37+
sum += array[i];
2538
}
26-
sum += array[i];
39+
return leftSum + rightSum;
2740
}
28-
sum = 0;
29-
for (i = middle + 1; i < right; i += 1) {
30-
if (sum + array[i] >= rightSum) {
31-
rightSum = sum + array[i];
41+
42+
/**
43+
* Using divide and conquer finds the maximum sum of subarray of the given
44+
*
45+
* @param {array} array
46+
* @param {number} left side of the range
47+
* @param {number} the right side of the range
48+
* @return {number} the maximum sum of the elements of
49+
* subarray whithin the given range
50+
*/
51+
function maxSubarrayPartitioner(array, left, right) {
52+
if (right - left <= 1) {
53+
return array[left];
3254
}
33-
sum += array[i];
55+
var middle = Math.floor((left + right) / 2),
56+
leftSum = maxSubarrayPartitioner(array, left, middle),
57+
rightSum = maxSubarrayPartitioner(array, middle, right),
58+
crossSum = crossSubarray(array, left, middle, right);
59+
60+
return Math.max(crossSum, leftSum, rightSum);
3461
}
35-
return leftSum + rightSum;
36-
}
3762

38-
/**
39-
* Using divide and conquer finds the maximum sum of subarray of the given
40-
*
41-
* @param {array} array
42-
* @param {number} left side of the range
43-
* @param {number} the right side of the range
44-
* @return {number} the maximum sum of the elements of
45-
* subarray whithin the given range
46-
*/
47-
function maxSubarrayPartitioner(array, left, right) {
48-
if (right - left <= 1) {
49-
return array[left];
63+
/**
64+
* Returns the maximum sum of the elements of a subarray of the given array
65+
*
66+
* @param {array} the array
67+
* @return the maximum sum
68+
*/
69+
function maxSubarray(array) {
70+
return maxSubarrayPartitioner(array, 0, array.length);
5071
}
51-
var middle = Math.floor((left + right) / 2),
52-
leftSum = maxSubarrayPartitioner(array, left, middle),
53-
rightSum = maxSubarrayPartitioner(array, middle, right),
54-
crossSum = crossSubarray(array, left, middle, right);
5572

56-
return Math.max(crossSum, leftSum, rightSum);
57-
}
73+
exports.maxSubarray = maxSubarray;
5874

59-
/**
60-
* Returns the maximum sum of the elements of a subarray of the given array
61-
*
62-
* @param {array} the array
63-
* @return the maximum sum
64-
*/
65-
function maxSubarray(array) {
66-
return maxSubarrayPartitioner(array, 0, array.length);
67-
}
75+
}(typeof exports === 'undefined' ? window : exports));

0 commit comments

Comments
 (0)