算法导论—最大子数组C/C++实现

原理实见算法导论第三版P39—P42:

C代码实现:

<span style="font-size:18px;">#include <stdio.h>
#include <stdlib.h>
#include "limits.h"
#define INT_MIN (-INT_MAX - 1)
	int *Find_Max_Subarray(int *A,int low,int high);
int *Find_Max_Crossing_Subarray(int *A,int low,int mid,int high);
void main()
{
	int array[16]={13,-3,-25,20,-3,-16,-23,18,20,-7,12,-5,-22,15,-4,7};
	int *ans=(int *)malloc(sizeof(int)*3);
	ans=Find_Max_Subarray(array,0,15);
	printf("%d,%d,%d\n",ans[0],ans[1],ans[2]);
	free(ans);
}
int *Find_Max_Crossing_Subarray(int *A,int low,int mid,int high)
{
	int left_sum=INT_MIN;
	int right_sum=INT_MIN;
	int sum=0;
	int max_left,max_right;
	for (int i=mid;i>low-1;i--)
	{
		sum+=*(A+i);
		if (sum>left_sum)
		{
			left_sum=sum;
			max_left=i;
		}
	}
	sum=0;
	for (int j=mid+1;j<high+1;j++)
	{
		sum+=*(A+j);
		if (sum>right_sum)
		{
			right_sum=sum;
			max_right=j;
		}
	}
	int *results=(int *)malloc(sizeof(int)*3);
	results[0]=max_left;
	results[1]=max_right;
	results[2]=left_sum+right_sum;
	return results;
}
int *Find_Max_Subarray(int *A,int low,int high)
{
	int *answers=(int *)malloc(sizeof(int)*3);
	if(low==high)
	{
		answers[0]=low;
		answers[1]=high;
		answers[2]=A[low];
		return answers;
	}
	else
	{
		int *answers_1=(int *)malloc(sizeof(int)*3);
		int *answers_2=(int *)malloc(sizeof(int)*3);
		int mid=(low+high)/2;
		answers=Find_Max_Subarray(A,low,mid);
		answers_1=Find_Max_Subarray(A,mid+1,high);
		answers_2=Find_Max_Crossing_Subarray(A,low,mid,high);
		if (answers[2]>=answers_1[2] && answers[2]>=answers_2[2])
			return answers;
		else if(answers_1[2]>=answers[2] && answers_1[2]>=answers_2[2])
			return answers_1;
		else
			return answers_2;
	}
}</span>


存在的问题:子函数中动态分配的内存没有释放
解决方案:1、不要在子函数中分配,直接全局动态分配空间,最后再释放
    2、使用结构体
    3、使用c++


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值