max_subarray find_maximum_subarray_mixed(int A[], unsigned low, unsigned high) { if (high - low < CROSSOVER_POINT) { return find_maximum_subarray_brute(A, low, high); } else { unsigned mid = (low + high) / 2; max_subarray left = find_maximum_subarray_mixed(A, low, mid); max_subarray right = find_maximum_subarray_mixed(A, mid, high); max_subarray cross = find_max_crossing_subarray(A, low, mid, high); if (left.sum >= right.sum && left.sum >= cross.sum) { return left; } else if (right.sum >= left.sum && right.sum >= cross.sum) { return right; } else { return cross; } } }
max_subarray find_maximum_subarray(int A[], unsigned low, unsigned high) { if (high == low + 1) { max_subarray result = {low, high, A[low]}; return result; } else { unsigned mid = (low + high) / 2; max_subarray left = find_maximum_subarray(A, low, mid); max_subarray right = find_maximum_subarray(A, mid, high); max_subarray cross = find_max_crossing_subarray(A, low, mid, high); if (left.sum >= right.sum && left.sum >= cross.sum) { return left; } else if (right.sum >= left.sum && right.sum >= cross.sum) { return right; } else { return cross; } } }
struct triple find_max_subarray_recur(int arr[], int low, int high){ if(low < high){ int middle = (low + high) / 2; struct triple left_triple = find_max_subarray_recur(arr, low, middle); struct triple right_triple = find_max_subarray_recur(arr, middle + 1, high); struct triple crossing_triple = find_max_crossing_subarray(arr, middle, low, high); struct triple max_triple = left_triple; if(right_triple.sum > max_triple.sum){ max_triple = right_triple; } if(crossing_triple.sum > max_triple.sum){ max_triple = crossing_triple; } return max_triple; } else{ struct triple t; t.from = low; t.to = low; t.sum = arr[low]; return t; } }