Пример #1
0
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;
		}
	}
}
Пример #2
0
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;
		}
	}
}
Пример #3
0
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;
    }
}