编程环境:Code::Blocks
编程语言:C
注:第一题未在程序平台运行,仅在编程环境运行
第一题代码
#include
#include
void Print(int *,int *);
//暴力求解最大子列问题O(N^3)
int Baoli(int,int*);
//累加求解最大子列问题O(N^2)
int Leijia(int,int*);
//在线求解最大子列问题O(N)
int OnLine(int,int*);
//分而治之求解最大子列问题O(N*logN)
int TwoDiv(int left,int right,int *Str);
//中间边界向两边累加,求取跨边界最大值
int CLineLeftRight(int center,int left,int right,int *Str);
int max3(int,int,int);
int main()
{
int N;
int Str[100]={0};
int MaxSum1=0,MaxSum2=0,MaxSum3=0,MaxSum4=0;
Print(&N,Str);
//baoli
MaxSum1=Baoli(N,Str);
//leijia
MaxSum2=Leijia(N,Str);
//fenzhi
MaxSum3=TwoDiv(0,N-1,Str);
//zaixian
MaxSum4=OnLine(N,Str);
printf("MaxSum1=%d\n",MaxSum1);
printf("MaxSum2=%d\n",MaxSum2);
printf("MaxSum3=%d\n",MaxSum3);
printf("MaxSum4=%d\n",MaxSum4);
return 0;
}
void Print(int *N,int *Str)
{
printf("Please Input Number:\n");
scanf("%d",N);
printf("\n");
printf("Please Input List[]:\n");
for(int i=0;i<*N;i++)
scanf("%d",&Str[i]);
printf("\n");
}
int Baoli(int N,int *Str)
{
int Sum=0;
int MaxSum=0;
for(int i=0;i<N;i++)
{
for(int j=i;j<N;j++)
{
Sum=0;
for(int k=i;k<=j;k++)
{
Sum+=Str[k];
}
if(Sum>MaxSum)
MaxSum=Sum;
}
}
return MaxSum;
}
int Leijia(int N,int *Str)
{
int Sum=0;
int MaxSum=0;
for(int i=0;i<N;i++)
{
Sum=0;
for(int j=i;j<N;j++)
{
Sum+=Str[j];
if(Sum>MaxSum)
MaxSum=Sum;
}
}
return MaxSum;
}
//递归:终止条件+递推关系
int TwoDiv(int left,int right,int *Str)
{
int MaxLeftSum=0,MaxRightSum=0,MaxCenter=0;
//终止条件
if(right==left)
return Str[left]>0 ? Str[left]:0;
//分
int center = (left+right)/2;
MaxLeftSum=TwoDiv(left,center,Str);
MaxRightSum=TwoDiv(center+1,right,Str);
MaxCenter=CLineLeftRight(center,left,right,Str);
return max3(MaxLeftSum,MaxRightSum,MaxCenter);
}
int CLineLeftRight(int center,int left,int right,int *Str)
{
int Sum1=0;
int Sum2=0;
int MaxSum1=0;
int MaxSum2=0;
for(int i=center;i>=left;i--)
{
Sum1+=Str[i];
if(Sum1>MaxSum1)
MaxSum1=Sum1;
}
for(int i=center+1;i<=right;i++)
{
Sum2+=Str[i];
if(Sum2>MaxSum2)
MaxSum2=Sum2;
}
return MaxSum1+MaxSum2;
}
int max3(int a,int b,int c)
{
return a>b ? a>c ? a:b: (b>c) ? b:c ;
}
int OnLine(int N,int *Str)
{
int MaxSum=0,Sum=0;
for(int i=0;i<N;i++)
{
Sum+=Str[i];
if(Sum>MaxSum)//更新
MaxSum=Sum;
else if(Sum<0)//当前序列和为-,舍去。
Sum=0;
}
return MaxSum;
}
第二题答案基本同上
#include
#include
void Print(int *,int *);
//在线求解最大子列问题O(N)
int OnLine(int,int*,int*,int*);
int main()
{
int N;
int Str[10000];
int MaxSum4=-1;
int MaxIndexR=0,MaxIndexL=0;;
Print(&N,Str);
//zaixian
MaxSum4=OnLine(N,Str,&MaxIndexL,&MaxIndexR);
if(MaxSum4<0)
printf("0 %d %d",Str[0],Str[N-1]);
else
printf("%d %d %d",MaxSum4,Str[MaxIndexL],Str[MaxIndexR]);
return 0;
}
void Print(int *N,int *Str)
{
scanf("%d",N);
for(int i=0;i<*N;i++)
scanf("%d",&Str[i]);
}
int OnLine(int N,int *Str,int *MaxIndexL,int *MaxIndexR)
{
int MaxSum=-1,Sum=0;
int IndexL=0,IndexR=0;
*MaxIndexL=0;
*MaxIndexR=0;
for(int i=0;i<N;i++)
{
Sum+=Str[i];
IndexR=i;
if(Sum>MaxSum)//更新
{
MaxSum=Sum;
*MaxIndexL=IndexL;
*MaxIndexR=IndexR;
}
else if(Sum<0)//当前序列和为-,舍去。
{
Sum=0;
IndexR=i+1;
IndexL=i+1;
}
}
return MaxSum;
}
第三题代码
//指向结构体变量的指针a,则(a).b 等价于 a->b
Position BinarySearch( List L, ElementType X )
{
int left,right,center;
left=1;
right=(*L).Last;
while(left<=right)
{
int center=(left+right)/2;
if(X < (*L).Data[center])
right=center-1;
else if(X > (*L).Data[center])
left=center+1;
else
return center;
}
return NotFound;
}