深入探究第三大数

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

你可能感兴趣的:(深入探究第三大数)