小算法--最大子数组

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};
	}
	int	mid = (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};
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值