数组中最大子数组之和

数组中最大子数组之和

 

题目:求一组数组中最大的子数组之和

一、实现代码

使用java编写的代码如下:

 

import java.util.Scanner;

public class Maxsum {
    public  int Max(int Array[],int size){
        int max=Array[0];
        int num;
        int sum=max;
        for(num=1;num<size;num++)
        {
            if(sum<0)
                sum=Array[num];
            else
                sum+=Array[num];
            if(sum>max)
                max=sum;
        }
        return max;
    }
    public static void main(String[] args){
        Maxsum sum=new Maxsum();
        Scanner in=new Scanner(System.in);
        int size=in.nextInt();
        int []Array=new int[size];
        int num;
        for(num=0;num<size;num++)
            Array[num]=in.nextInt();
        System.out.println(sum.Max(Array,size));
        in.close();
    }
}

 

 

使用C语言编写的代码为:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    public class Program
    {
        public int maxSubArray(int[] A, int n)
        {
            int cursum = A[0];
            int maxsum = A[0];
            for (int i = 0; i < n; i++)
            {
                if (cursum < 0)
                    cursum = 0;
                cursum += A[i];
                if (cursum > maxsum)
                    maxsum = cursum;
            }
            return maxsum;
        }
        static void Main(string[] args)
        {
            int[] A = { -2, 5, 3, -6, 4, -8, 6 };
            Program fuc = new Program();
            Console.WriteLine(fuc.maxSubArray(A, A.Length));
            Console.ReadKey();
        }
    }
}

二、单元测试

使用java语言进行单元测试的代码为:

import static org.junit.jupiter.api.Assertions.*;

import org.junit.jupiter.api.Test;

import static org.junit.Assert.*;

public class MaxsumTest {
   Maxsum sum=new Maxsum();

   public void setUp() throws Exception {

   }

public void tearDown() throws Exception {

   }
   @Test
   public void testMax1() {
       int []Array=new int[]{1,-2,4,-1,-5};
       assertEquals(4, sum.Max(Array,5));
   }
   @Test
   public void testMax2() {
       int []Array=new int[]{1,-2,-4,1,5};
       assertEquals(6, sum.Max(Array,5));
   }
   @Test
   public void testMax3() {
       int []Array=new int[]{1,2,3,1,1};
       assertEquals(8, sum.Max(Array,5));
   }
   @Test
   public void testMax4() {
       int []Array=new int[]{-1,-2,-4,-1,-5};
       assertEquals(-1, sum.Max(Array,5));
   }
   @Test
   public void testMax5() {
       int []Array=new int[]{0,0,0,0,0};
       assertEquals(0, sum.Max(Array,5));
   }
}

使用java对代码进行单元测试的结果为:

 从左边的测试结果可以看出,每个测试用例都通过了测试。

使用C语言进行单元测试,代码如下:

using ConsoleApplication1;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;

namespace MaxsumTest
{
    
    
    /// <summary>
    ///这是 ProgramTest 的测试类,旨在
    ///包含所有 ProgramTest 单元测试
    ///</summary>
    [TestClass()]
    public class ProgramTest
    {


        private TestContext testContextInstance;

        /// <summary>
        ///获取或设置测试上下文,上下文提供
        ///有关当前测试运行及其功能的信息。
        ///</summary>
        public TestContext TestContext
        {
            get
            {
                return testContextInstance;
            }
            set
            {
                testContextInstance = value;
            }
        }

        #region 附加测试特性
        // 
        //编写测试时,还可使用以下特性:
        //
        //使用 ClassInitialize 在运行类中的第一个测试前先运行代码
        //[ClassInitialize()]
        //public static void MyClassInitialize(TestContext testContext)
        //{
        //}
        //
        //使用 ClassCleanup 在运行完类中的所有测试后再运行代码
        //[ClassCleanup()]
        //public static void MyClassCleanup()
        //{
        //}
        //
        //使用 TestInitialize 在运行每个测试前先运行代码
        //[TestInitialize()]
        //public void MyTestInitialize()
        //{
        //}
        //
        //使用 TestCleanup 在运行完每个测试后运行代码
        //[TestCleanup()]
        //public void MyTestCleanup()
        //{
        //}
        //
        #endregion


        /// <summary>
        ///maxSubArray 的测试
        ///</summary>
        [TestMethod()]
        public void maxSubArrayTest1()
        {
            Program test = new Program();
            int[] A = { -2, 5, 3, -6, 4, -8, 6 };
            Assert.AreEqual(test.maxSubArray(A, A.Length), 8);
        }
        [TestMethod()]
        public void maxSubArrayTest2()
        {
            Program test = new Program();
            int[] A = { 0, 0, 0 };
            Assert.AreEqual(test.maxSubArray(A, A.Length), 0);
        }
        [TestMethod()]
        public void maxSubArrayTest3()
        {
            Program test = new Program();
            int[] A = { -2 };
            Assert.AreEqual(test.maxSubArray(A, A.Length), -2);
        }
        [TestMethod()]
        public void maxSubArrayTest4()
        {
            Program test = new Program();
            int[] A = { -6,-5,-4,-3};
            Assert.AreEqual(test.maxSubArray(A, A.Length), -3);
        }
        [TestMethod()]
        public void maxSubArrayTest5()
        {
            Program test = new Program();
            int[] A = { -2,5,3,-6,10,-8,6 };
            Assert.AreEqual(test.maxSubArray(A, A.Length), 12);
        }
    }
}

 

测试结果为:

 

 

 从结果可以看出,该测试用例都通过测试。

三、效能分析

1.什么是效能分析

效能分析,指对某种事物或系统执行某一项任务结果或者进程的质量好坏、作用大小、自身状态等效率指标的量化计算或结论性评价。效能是指系统在规定条件下达到规定使用目标的能力。“规定的条件”指的是环境条件、时间、人员、使用方法等因素;“规定使用目标”指的是所要达到的目的;“能力”则是指达到目标的定量或定性程度。

2.jprofiler实现

JProfiler是一个商业授权的Java剖析工具,它把CPU、执行绪和内存的剖析组合在一个强大的应用中,可提供许多IDE整合和应用服务器整合用途。

遍历:

cpu视图:

 线程视图:

线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位,一个进程中可以并发多个线程,每条线程并行执行不同的任务。

posted @ 2021-03-13 22:27  罗罗~  阅读(113)  评论(1)    收藏  举报