#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语言描述》。
最大子序列算法效率比较
最新推荐文章于 2020-08-08 22:12:27 发布