分治法求解最大子序列和c语言
时间: 2024-06-19 11:04:43 浏览: 146
分治法求解最大子序列和是一种比较常用的算法,其主要思想是将问题分解成多个子问题,逐个解决子问题,最后将结果合并得到最终结果。下面是C语言实现分治法求解最大子序列和的代码:
```
#include <stdio.h>
#include <limits.h>
int max(int a, int b) {
return a > b ? a : b;
}
int max_sum_crossing(int arr[], int left, int mid, int right) {
int left_sum = INT_MIN;
int right_sum = INT_MIN;
int sum = 0;
for (int i = mid; i >= left; i--) {
sum += arr[i];
if (sum > left_sum) {
left_sum = sum;
}
}
sum = 0;
for (int i = mid + 1; i <= right; i++) {
sum += arr[i];
if (sum > right_sum) {
right_sum = sum;
}
}
return left_sum + right_sum;
}
int max_sum_subarray(int arr[], int left, int right) {
if (left == right) {
return arr[left];
}
int mid = (left + right) / 2;
int left_sum = max_sum_subarray(arr, left, mid);
int right_sum = max_sum_subarray(arr, mid + 1, right);
int cross_sum = max_sum_crossing(arr, left, mid, right);
return max(max(left_sum, right_sum), cross_sum);
}
int main() {
int arr[] = {1, -2, 3, 5, -2, 6, -1};
int n = sizeof(arr) / sizeof(arr);
int max_sum = max_sum_subarray(arr, 0, n - 1);
printf("Max subarray sum is %d", max_sum);
return 0;
}
```
该算法的时间复杂度为O(nlogn),比暴力算法的时间复杂度O(n^2)更加优秀。如果您对该算法有任何疑问,请继续提问。
阅读全文