继上一篇博客之后,求第三个数有可以进行进一步的优化,面试官看过之后,又给了我一些点评,再次感激不尽,说我的程序可以再一次优化,用一个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大数