浙江大学MOOC数据结构-陈越、何钦铭 编程练习题(第一讲)

浙江大学MOOC数据结构-陈越、何钦铭 编程练习题(第一讲)

编程题目

浙江大学MOOC数据结构-陈越、何钦铭 编程练习题(第一讲)_第1张图片

编程说明

编程环境: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;
}

你可能感兴趣的:(浙江大学MOOC数据结构-陈越、何钦铭 编程练习题(第一讲))