zoukankan      html  css  js  c++  java
  • 团队作业3返回整数数组中最大子数组的和(多个数组)

    要求:

      1.输入一个整形数组,数组里有整数有负数

      2.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和

      3.如果数组A[0].........A[j-1]首尾相邻,允许A[i-1],..........A[n-1],A[0].......A[j-1]之和最大

      4.同时返回最大子数组的位置

      5.求所有子数组的和的最大值

    实验思路:

            首先随机生成一个二维数组,再形成子数组,记录子数组个数,然后求每个子数组和,记录下来。在随机生成一个二维数组,生成子数组,与上一个数组的子数组结成新的子数组,并且求子数组的和,将子数组和形成一个新的数组,进行遍历,找到最大值。

    程序代码:

    复制代码
    //返回整数数组中最大子数组的和(各数组首尾相连)
    #include<iostream>
    #define N 100
    using namespace std;
     
    //构造子数组结构
    typedef struct SArray
    {
        int Sdata;  //子数组中的数
        int start;  //子数组的起始位置
        int end;    //子数组的终止位置
    }SArray;
     
    //构造链表的存储结构
    typedef struct LNode
    {
        int data;   //int position;   //数所在数组中的位置
        struct LNode *next; //指针
    }LNode, *LinkList;
     
    //创建循环链表
    void CreateList(LinkList &L, int Group[], int n)
    {
        L = new LNode;
        L->next = NULL;
        LNode *r;
        r = L;
        for (int i = 0; i < n - 1; i++)
        {
            LNode *p;
            p = new LNode;
            p->data = Group[i];
            p->position = i + 1;
            p->next = NULL;
            r->next = p;
            r = p;
        }
        LNode *p;
        p = new LNode;
        p->data = Group[n - 1];
        p->position = n;
        p->next = L->next;
        r->next = p;
    }
     
    //返回最大子数组
    SArray Compare(LinkList L, int Length)
    {
        SArray MaxSum[N][2];
        //MaxSum[N][0].Sdata表示前N-1个数中,最大的子数组
        //MaxSum[N][1].Sdata表示前N-1个数的最大的子数组和加第N个数的和与第N个数相比的最大值
        LNode *r;
        r = L->next;
        MaxSum[0][0].Sdata = MaxSum[0][1].Sdata = r->data;
        MaxSum[0][0].start = MaxSum[0][1].start = r->position;
        MaxSum[0][0].end = MaxSum[0][1].end = r->position;
        for (int i = 1; i < Length; i++)
        {
            if (MaxSum[i - 1][0].Sdata > MaxSum[i - 1][1].Sdata)
            {
                MaxSum[i][0].Sdata = MaxSum[i - 1][0].Sdata;
                MaxSum[i][0].start = MaxSum[i - 1][0].start;
                MaxSum[i][0].end = MaxSum[i - 1][0].end;
            }
            else
            {
                MaxSum[i][0].Sdata = MaxSum[i - 1][1].Sdata;
                MaxSum[i][0].start = MaxSum[i - 1][1].start;
                MaxSum[i][0].end = MaxSum[i - 1][1].end;
            }
            if (MaxSum[i - 1][1].Sdata + r->next->data > r->next->data)
            {
                MaxSum[i][1].Sdata = MaxSum[i - 1][1].Sdata + r->next->data;
                MaxSum[i][1].start = MaxSum[i - 1][1].start;
                MaxSum[i][1].end = r->next->position;
            }
            else
            {
                MaxSum[i][1].Sdata = r->next->data;
                MaxSum[i][1].start = r->next->position;
                MaxSum[i][1].end = r->next->position;
            }
            r = r->next;
        }
        if (MaxSum[Length - 1][0].Sdata > MaxSum[Length - 1][1].Sdata)
        {
            return MaxSum[Length - 1][0];
        }
        else
        {
            return MaxSum[Length - 1][1];
        }
    }
     
    //将含n个数的循环数组依次从各个点断开,产生n个含n个数组的单链数组
    SArray Divide(LinkList L, int length)
    {
        LinkList LGroup[N]; //头节点集合
        LNode *r;
        r = L;
        for (int i = 0; i < length; i++)
        {
            LGroup[i] = r;
            r = r->next;
        }
        SArray MaxGroup[N]; //分成的各个数组的最大子数组的集合
        for (int i = 0; i < length; i++)
        {
            MaxGroup[i].Sdata = Compare(LGroup[i], length).Sdata;
            MaxGroup[i].start = Compare(LGroup[i], length).start;
            MaxGroup[i].end = Compare(LGroup[i], length).end;
        }
        SArray Max = MaxGroup[0];   //各个数组的最大子数组和的最大值
        for ( i = 1; i < length; i++)
        {
            if (Max.Sdata < MaxGroup[i].Sdata)
            {
                Max.Sdata = MaxGroup[i].Sdata;
                Max.start = MaxGroup[i].start;
                Max.end = MaxGroup[i].end;
     
            }
        }
        return Max;
    }
     
    int main()
    {
        int Number[N];  //整数数组
        int length; //数组长度
        cout << "请输入一个整型数组:" << endl;
        cin >> Number[0];
        length = 1;
        while (getchar() != '
    ')
        {
            cin >> Number[length++];
        }
        LinkList L;
        CreateList(L, Number, length);
        cout << "该数组中的最大的子数组和为:";
        cout << Divide(L, length).Sdata << endl;
        cout << "该最大子数组的起始位置为:";
        cout << Divide(L, length).start << endl;
        cout << "该最大子数组的终止位置为:";
        cout << Divide(L, length).end << endl;
        return 0;
    }
    复制代码

    实验结果:

    作业分工:

      姓名 :郭少周负责代码的运行调试和复核。我负责查找资料,编写代码。

    实验心得:这次实验让我看到了自己的不足,同时也学习到新的数组计算方法,一个圆环数组切开一刀后如何遍历,有了新的认识,团结力量大。

  • 相关阅读:
    【Unity编程】欧拉角与万向节死锁(图文版)
    关于ListView中getView被重复调用的问题
    svn 错误集锦续
    android 无法生成R文件的原因剖析
    SVN下错误集锦
    视频文件格式
    国内各视频网站android pad客户端支持分辨率情况初步统计
    android 下的网络图片加载
    遇到问题描述:Android Please ensure that adb is correctly located at问题解决
    android 时间控件概述
  • 原文地址:https://www.cnblogs.com/czlyl999/p/9905003.html
Copyright © 2011-2022 走看看