最大子序列算法效率比较

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define NM 250//数据个数
typedef int (*F)(const int A[],int N);//定义函数指针

/*---------------------------产生数据---------------------------*/
void ProductData(int n)
{
	FILE *fp;
	int c,*p;
	p=&c;
	//判断文件是否存在
	if((fp=fopen("Data.dat","rb"))==NULL)
	{
		printf("文件不存在,将创建文件!\n");
		fp=fopen("Data.dat","wb");
		srand((unsigned)time(NULL));
		while(n)
		{
			*p=rand()%100;
			if(rand()%2)
				*p=*p*(-1);//随机正负值
			fwrite(p,4,1,fp);
			n--;
		}
		fclose(fp);
	}
	else
	{
		printf("文件已存在!\n");
		fclose(fp);
	}
	/*测试写成功
	fp=fopen("Data.dat","rb");
	int i=0;
	while(i<NM)
	{
		fread(p,4,1,fp);
		printf("%d ",*p);
		i++;
	}
	printf("\n");
	fclose(fp);*/
}
/*---------------------------方法一---------------------------*/
int MaxSubsequenceSum(const int A[],int N)
{
	int ThisSum,MaxSum,i,j,k;
	MaxSum=0;
	for(i=0;i<N;i++)//控制位置
		for(j=i;j<N;j++)//控制子序列元素数
		{
			ThisSum=0;
			for(k=i;k<=j;k++)//求每个子序列的和
				ThisSum+=A[k];
			if(ThisSum>MaxSum)
				MaxSum=ThisSum;
		}
	return MaxSum;
}
/*---------------------------方法二---------------------------*/
int MaxSubsequenceSum2(const int A[],int N)
{
	int ThisSum,MaxSum,i,j;
	MaxSum=0;
	for(i=0;i<N;i++)//控制位置
	{
		ThisSum=0;
		for(j=i;j<N;j++)//求最大子序列和
		{
			ThisSum+=A[j];
			if(ThisSum>MaxSum)
				MaxSum=ThisSum;
		}
	}
	return MaxSum;
}
/*---------------------------方法三---------------------------*/
int Max3(int a,int b,int c)
{
	int t;
	t=a>b?a:b;
	t=t>c?t:c;
	return t;
}
static int MaxSubSum(const int A[],int Left,int Right)
{
	int MaxLeftSum,MaxRightSum;
	int MaxLeftBorderSum,MaxRightBorderSum;
	int LeftBorderSum,RightBorderSum;
	int Center,i;
	if(Left == Right)/*Base Case*/
		if(A[Left]>0)
			return A[Left];
		else
			return 0;
	Center=(Left+Right)/2;
	MaxLeftSum=MaxSubSum(A,Left,Center);
	MaxRightSum=MaxSubSum(A,Center+1,Right);
	MaxLeftBorderSum=0;LeftBorderSum=0;
	for(i=Center;i>=Left;i--)
	{
		LeftBorderSum+=A[i];
		if(LeftBorderSum>MaxLeftBorderSum)
			MaxLeftBorderSum=LeftBorderSum;
	}
	MaxRightBorderSum=0;RightBorderSum=0;
	for(i=Center+1;i<=Right;i++)
	{
		RightBorderSum+=A[i];
		if(RightBorderSum>MaxRightBorderSum)
			MaxRightBorderSum=RightBorderSum;
	}
	return Max3(MaxLeftSum,MaxRightSum,MaxLeftBorderSum+MaxRightBorderSum);
}
int MaxSubsequenceSum3(const int A[],int N)
{
	return MaxSubSum(A,0,N-1);
}
/*---------------------------方法四---------------------------*/
int MaxSubsequenceSum4(const int A[],int N)
{
	int ThisSum,MaxSum,j;
	ThisSum=MaxSum=0;
	for(j=0;j<N;j++)
	{
		ThisSum+=A[j];
		if(ThisSum>MaxSum)
			MaxSum=ThisSum;
		else if(ThisSum<0)
			ThisSum=0;
	}
	return MaxSum;
}
/*---------------------------main函数---------------------------*/
void main()
{
	FILE *fp;
	int num[NM]={0},i=0,sum=0;
	clock_t start,finish;
	F function[4];
	function[0]=&MaxSubsequenceSum;
	function[1]=&MaxSubsequenceSum2;
	function[2]=&MaxSubsequenceSum3;
	function[3]=&MaxSubsequenceSum4;
	ProductData(NM);//产生数据文件
	fp=fopen("Data.dat","rb");//读文件数据
	while(i<NM)
	{
		fread(&num[i],4,1,fp);
		i++;
	}
	fclose(fp);
	for(i=0;i<4;i++)//方法一和方法二性能太差,方法三很好,方法四性能最好。可以把此语句改为:for(i=2;i<4;i++),将NM改大后只观察后两种方法的运算时间。
	{
		start=clock();
		sum=function[i](num,NM);
		finish=clock();
		printf("MaxSubsequenceSum=%d,	used %f seconds\n",sum,(double)(finish-start)/CLOCKS_PER_SEC);
	}
}
参考《数据结构与算法分析——C语言描述》。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值