继上一篇博客之后,求第三个数有可以进行进一步的优化,面试官看过之后,又给了我一些点评,再次感激不尽,说我的程序可以再一次优化,用一个for循环就可以搞定。ok,既然有这样的需求,那么下面我们就用一个for循环,将其搞定。
首先当时我正在河南的家中,陪家人看电视,收到面试官的短信之后,立刻打开电脑,用老家跟蜗牛似的3G上网卡,写下了这一篇博客,因为网速很慢,原本已经写好的东西,当保存的时候,突然没有网络,当我重新刷新这个页面的时候,原先写的东西已经不复存在。好吧,下面将我的心路历程分享给大家。
package com.yting.hadoop.rpc; /** * 第三大数优化 * @author zhengyunfei * @date 2014-04-18 * */ public class ThirdData { public static void main(String[] args) { int a[] = new int[100000]; for(int i=0;i<100000;i++){ a[i]=i; } long pre=System.currentTimeMillis(); int result=getThirdNum(a); long last=System.currentTimeMillis(); long time=last-pre; System.out.print("第三大数:"+result+" 耗时:"+time+"毫秒"); } public static int getThirdNum(int[] a) { //首页定义三个变量; int maxNum=0;//第一大数 int secondNum=0;//第二大数 int thirdNum=0;//第三大数 //其次将三个数放到一位数组array中 int array []={a[0],a[1],a[2]}; //接下来比较这三个数的小 maxNum=getSortData(1,array); secondNum=getSortData(2,array); thirdNum=getSortData(3,array); //将这三个数,按照从大到小的顺序 重新放到一位数组array当中 array[0]=maxNum; array[1]=secondNum; array[2]=thirdNum; int length = a.length;//数组的长度 for (int i = 3; i < length; i++) { if (a[i] >thirdNum)//如果数组a当中有比array[3]大的数,证明array[3]不是第三大的数 { secondNum=a[i];//将数组array中第三大数array[2],替换成a[i] array[2]=secondNum; //将新添加来的a[i]与数组array当中原有的array[0],array[1]重新比较大小,求最大值,第二大值,第三大值 maxNum=getSortData(1,array); secondNum=getSortData(2,array); thirdNum=getSortData(3,array); //求出值后,再将这三个数,重新按照从大到小的顺序,放到数组array当中 array[0]=maxNum; array[1]=secondNum; array[2]=thirdNum; } } return thirdNum;//返回第三大数 } /** * 求长度为3的数组当中,第一大,第二大,第三大数分别是多少 * @author zhengyunfei * @date 2014-04-18 * @param i index * @param array 书组名称 * @return */ public static int getSortData(int i,int array[]){ int a=array[0],b=array[1],c=array[2]; if(i==1){ return a>b && a>c?a:(b>c?b:c);//最大值 }else if(i==2){ return a>b && a<c||a<b&&a>c?a:(a<b&&a<c?(b>c?c:b):(b>c?b:c));//第二大值 } else { return a<b && a<c?a:(b<c?b:c); //第三大值 } } }
10万个数,求第三大数,运行结果如下:
第三大数:99997 耗时:8毫秒
感觉上面的程序有一些是重复型的代码,所以,下面我需要对上面的代码进行方法的重构,重构后的代码如下:
package com.yting.hadoop.rpc; /** * 第三大数优化 * @author zhengyunfei * @date 2014-04-18 * */ public class GetThirdData { public static void main(String[] args) { int a[] = new int[100000]; for(int i=0;i<100000;i++){ a[i]=i; } long pre=System.currentTimeMillis(); int result=getThirdNum(a); long last=System.currentTimeMillis(); long time=last-pre; System.out.print("第三大数:"+result+" 耗时:"+time+"毫秒"); } public static int getThirdNum(int[] a) { //首页定义三个变量; int maxNum=0;//第一大数 int secondNum=0;//第二大数 int thirdNum=0;//第三大数 //其次将三个数放到一位数组array中 int array []={a[0],a[1],a[2]}; thirdNum = getSortArray(array); int length = a.length;//数组的长度 for (int i = 3; i < length; i++) { if (a[i] >thirdNum)//如果数组a当中有比array[3]大的数,证明array[3]不是第三大的数 { secondNum=a[i];//将数组array中第三大数array[2],替换成a[i] array[2]=secondNum; thirdNum = getSortArray(array); } } return thirdNum;//返回第三大数 } /** * 重构第三个数 * @author zhengyunfei * @date 2014-04-18 * @param array 数组名称 * @return */ private static int getSortArray(int[] array) { int maxNum; int secondNum; int thirdNum; //接下来比较这三个数的小 maxNum=getSortData(1,array); secondNum=getSortData(2,array); thirdNum=getSortData(3,array); //将这三个数,按照从大到小的顺序 重新放到一位数组array当中 array[0]=maxNum; array[1]=secondNum; array[2]=thirdNum; return thirdNum; } /** * 求长度为3的数组当中,第一大,第二大,第三大数分别是多少 * @author zhengyunfei * @date 2014-04-18 * @param i index * @param array 书组名称 * @return */ private static int getSortData(int i,int array[]){ int a=array[0],b=array[1],c=array[2]; if(i==1){ return a>b && a>c?a:(b>c?b:c);//最大值 }else if(i==2){ return a>b && a<c||a<b&&a>c?a:(a<b&&a<c?(b>c?c:b):(b>c?b:c));//第二大值 } else { return a<b && a<c?a:(b<c?b:c); //第三大值 } } }
同样重构后的程序运行结果也是:
第三大数:99997 耗时:10毫秒,由于具有误差,运行结果的耗时可能会存在一些细微的差异,这是正常的。
我的下一篇博客,将继续对求第三大数进行深入探究,将求第三大数,换成求第k大数,尽情期待。。。
下一篇深入探究第k大数,已经写好,地址:http://zhengyunfei.iteye.com/blog/2049087
至此,针对求第三大数的算法,我已经写了5篇博客,从前之后以此为:
第一篇:初写求第三大数算法
第二篇:优化求第三大数算法
第三篇:深入探究第三大数
第四篇:深入探究第K大数
第五篇:深入探究N个数组的第K大数