继上篇深入探究第k大数之后,此篇博客继续对上一篇进行深入探究,深入探究N个数组的第K大数是多少?
修改后的程序代码如下
package com.yting.hadoop.rpc;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/**
* 第三大数优化
* @author zhengyunfei
* @date 2014-04-18
*
*/
public class GetThirdData {
public static void main(String[] args) throws IOException {
int N = 0;
int k=0;
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
System.out.println("请输入一位数组的个数:");
N=Integer.parseInt(br.readLine());
System.out.println("请输入要求第几大数:");
k=Integer.parseInt(br.readLine());
int a[] = new int[N];
//自定义10万个数,赋予一位数组a
for(int i=0;i<N;i++){
System.out.println("请输入第"+(i+1)+"个数:");
int num=Integer.parseInt(br.readLine());
a[i]=num;
}
//程序执行开始时间
long pre=System.currentTimeMillis();
//求第k大数,与第三大数为例
int result=getSortKnum(a,k);
//程序执行结束时间
long last=System.currentTimeMillis();
long time=last-pre;//运行时间
System.out.println("运行结果为:");
System.out.print("第三大数:"+result+" 耗时:"+time+"毫秒");
}
/**
* 求第k大数
* @param a 数组名
* @param k 第几大数
* @return 第k大数
*/
private static int getSortKnum(int [] a,int k){
int array[]=new int [k];//首先定义一个k个数的一位数组
//将数组前k个数存放到数组array当中
for(int i=0;i<k;i++){
array[i]=a[i];
}
array=getSortArray(array);//对这k个数的数组进行冒泡排序
for(int i=k;i<a.length;i++){//将余下的数与第k大数进行比较
if(a[i]>array[k-1]){//如果余下数比第k大数大的话,将第k大数替换掉
array[k-1]=a[i];
array=getSortArray(array);//重新对数组进行排序
}
}
return array[k-1];
}
/**
* 对数组进行冒泡排序
* @author zhengyunfei
* @date 2014-04-18
* @param a 数组名
* @return a 排序后的数组
*/
private static int [] getSortArray(int a[]){
for(int i=0;i<a.length-1;i++){
for(int j=0;j<a.length-i-1;j++){
if(a[j]<a[j+1]){
swap(a, j);
}
}
}
return a;
}
/**
* 交换位置
* @author zhengyunfei
* @date 2014-04-18
* @param a 数组名
* @param j 下标
*/
private static void swap(int[] a, int j) {
int temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
运行结果如下:
请输入一位数组的个数:
10
请输入要求第几大数:
3
请输入第1个数:
1
请输入第2个数:
2
请输入第3个数:
3
请输入第4个数:
4
请输入第5个数:
9
请输入第6个数:
8
请输入第7个数:
7
请输入第8个数:
6
请输入第9个数:
5
请输入第10个数:
4
运行结果为:
第三大数:7 耗时:0毫秒
经过测试,程序是正确的,但是细心的朋友会发现,在控制台输入N和K的时候,我没有做限制,比如N和K必须是数字,并且N必须大于等于K,在此本人就不做限制了,感兴趣的朋友可以补充上。
至此,针对求第三大数的算法,我已经写了5篇博客,从前之后以此为:
第一篇:初写求第三大数算法
第二篇:优化求第三大数算法