小算法--最大子数组

来源:互联网 发布:新丰县网络问政乙 编辑:程序博客网 时间:2024/04/28 04:30

1、Θ(n2)算法

#include <stdio.h>typedef struct {int sum;int left;int right;} subarray;int main(){subarray max_subarray_n2(int [], int);int a[] = {13, -3, -25, 20, -3, -16, -23, 18, 20, -7, 12, -5, -22, 15, -4, 7};subarray result = max_subarray_n2(a, sizeof(a) / sizeof(a[0]));printf("max-subarray info:left=%d,right=%d,sum=%d\n", result.left, result.right, result.sum);return 0;}subarray max_subarray_n2(int a[], int length){subarray result = {.sum = a[0], .left = 0, .right = 0};for (int i = 0; i < length-1; ++i) {int tmp_sum = a[i];for (int j = i+1; j < length; ++j) {tmp_sum += a[j];if (tmp_sum > result.sum) {result = (subarray){tmp_sum, i, j};}}}return result;}

2、Θ(nlgn)算法

#include <stdio.h>typedef struct {int sum;int left;int right;} subarray;int main(){subarray max_subarray_nlgn(int [], int, int);subarray find_max_crossing_subarray(int [], int, int);int a[] = {13, -3, -25, 20, -3, -16, -23, 18, 20, -7, 12, -5, -22, 15, -4, 7};subarray result = max_subarray_nlgn(a, 0, sizeof(a) / sizeof(a[0]) - 1);printf("max-subarray info:left=%d,right=%d,sum=%d\n", result.left, result.right, result.sum);return 0;}subarray find_max_crossing_subarray(int a[], int left, int right){int mid = (left + right) / 2;int max_left = mid, max_right = mid + 1;int left_sum = a[mid], sum = 0;for (int i = mid; i >= left; --i) {sum += a[i];if (sum > left_sum) {max_left = i;left_sum = sum;}}sum = 0;int right_sum = a[mid+1];for (int i = mid+1; i <= right; ++i) {sum += a[i];if (sum > right_sum) {max_right = i;right_sum = sum;}}return (subarray){left_sum + right_sum, max_left, max_right};}subarray max_subarray_nlgn(int a[], int left, int right){if (left == right) {return (subarray){a[left], left, right};}intmid = (left + right) / 2;subarray left_array = max_subarray_nlgn(a, left, mid);subarray crossing_array = find_max_crossing_subarray(a, left, right);subarray right_array = max_subarray_nlgn(a, mid + 1, right);if (left_array.sum > crossing_array.sum && left_array.sum > right_array.sum) {return left_array;} else if (crossing_array.sum > left_array.sum && crossing_array.sum > right_array.sum) {return crossing_array;} else {return right_array;}}

3、Θ(n)算法

#include <stdio.h>typedef struct {int sum;int left;int right;} subarray;int main(){subarray max_subarray_n(int [], int);int a[] = {13, -3, -25, 20, -3, -16, -23, 18, 20, -7, 12, -5, -22, 15, -4, 7};subarray result = max_subarray_n(a, sizeof(a) / sizeof(a[0]));printf("max-subarray info:left=%d,right=%d,sum=%d\n", result.left, result.right, result.sum);return 0;}subarray max_subarray_n(int a[], int length){int left = 0, right = 0;int temp_sum1 = a[0],sum = a[0];int mid = -1, temp_sum2=0;for (int i = 1; i < length; ++i) {temp_sum1 += a[i];if (temp_sum1 > sum) {sum = temp_sum1;  right = i;mid = -1;temp_sum2 = 0;continue;} else if(a[i]>0 && mid == -1) {mid=i;}if (mid != -1) {if (temp_sum2 <=0 && a[i] > 0) {mid=i;temp_sum2 = a[i];} else {temp_sum2 += a[i];}}if(temp_sum2 > sum) {left = right = mid;sum = temp_sum1 = temp_sum2;mid = -1;temp_sum2=0;}}return (subarray){sum, left, right};}


原创粉丝点击