繼上篇深入探究第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篇部落格,從前之後以此為:
第一篇:初寫求第三大數算法
第二篇:優化求第三大數算法