最大子数组和算法(Java实现)

三种最大子数组和算法的Java实现和比较

代码于2018年12月12日重新更新了一下,因为之前代码上传时有部分丢失。这次,为了防止代码再丢失,我决定把源码的截图也贴上来(节选自《数据结构与算法分析——Java语言版》——Mark Allen Weiss 著 ---冯舜玺 译)。如下图:

第一种算法:运行时间为O(N^3),这完全取决于第13和14行,它们由一个含于三重嵌套for循环中的O(1)语句组成。第8行上的循环大小为N。

 第二种算法:运行时间为O(N^2)。

 第三种算法:运行时间为O(N log N)。

(1)Java代码

package com.sau.five.algorithmAnalysis;

public class MaxSubsequenceSum {
	
	public static int maxSubsequenceSum01(int[] a)  //方法1:时间复杂度n(o^3)
	{
		int maxSum=0;     //记录最大子数组和
		for(int i=0;i<a.length;i++)
			for(int j=i;j<a.length;j++)
			{
				int thisSum=0;  //临时记录
			
				for(int k=i;k<=j;k++)
				{
					thisSum+=a[k];
				}
				if(thisSum>maxSum)
				{
					maxSum=thisSum;
				}
			}
		return maxSum;
	}
	
	public static int maxSubsequenceSum02(int[] a)   //方法2:时间复杂度n(o^2)
	{
		int maxSum = 0;
		for (int i=0; i<a.length;i++)
		{
			int thisSum = 0;
			
			for (int j = i; j < a.length; j++){
                                thisSum += a[j];
                
                                if(thisSum > maxSum)
				{
					maxSum = thisSum;
				}
			}
		}
		return maxSum;
	}
	
	public static int maxSubsequenceSum03(int[] a)   //方法3:时间复杂度n(o)
	{
		int maxSum=0;
		int thisSum=0;
		for(int j = 0; j < a.length; j++){		
                        thisSum += a[j];

                        if(thisSum > maxSum)
                        {
				maxSum = thisSum;
			}
			else if(thisSum < 0)
			{
				thisSum = 0;
			}
		}
		return maxSum;
	}
	
	public static void main(String[] args)      //main方法
	{
		int L = 1000;     //数组长度
		long startTime00=System.nanoTime();   //获取程序开始时间
		MaxSubsequenceSum mss = new MaxSubsequenceSum();
		int[] a = new int[L];
		for(int i=0;i<L;i++)
		{
			a[i]=(int) (L-(Math.random()*2*L));   //随机L个-L~L之间的数
		}
		

		long startTime01=System.nanoTime();   //获取开始时间 
		System.out.println(mss.maxSubsequenceSum01(a));
		long endTime01=System.nanoTime(); //获取结束时间  
		System.out.println("程序01运行时间: "+(endTime01-startTime01)+"ns");
		
		
		long startTime02=System.nanoTime();   //获取开始时间  
		System.out.println(mss.maxSubsequenceSum02(a));
		long endTime02=System.nanoTime(); //获取结束时间  
		System.out.println("程序02运行时间: "+(endTime02-startTime02)+"ns");
		

		long startTime03=System.nanoTime();   //获取开始时间  
		System.out.println(mss.maxSubsequenceSum03(a));
		long endTime03=System.nanoTime(); //获取结束时间  
		System.out.println("程序03运行时间: "+(endTime03-startTime03)+"ns");
		
		
		long endTime00=System.nanoTime(); //获取程序结束时间  
		System.out.println("程序总运行时间: "+(endTime00-startTime00)+"ns");
	}
}

(2)三种算法运行结果比较

① 数组长度为1000时,运行结果如下图。比较三种算法的运行时间(单位:豪秒)约为 96.23:2.86:0.07,可见第三种算法的运行效率远高于前两种算法。

 
② 数组长度为10000时,运行结果如下图。比较三种算法的运行时间(单位:秒)约为 98.85:0.03:0.0003,而程序总运行时间也不过98.88秒,可见第一种算法几乎占用了程序运行的全部时间。

 

③ 数组长度为100000时,运行结果如下图。调换一下程序的运行顺序,比较三种算法的运行时间(单位:秒)约为   ∞:2.16:0.003,可见当数组长度达到10^6数量级时,第一种算法已经没有实用价值了惊恐

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值