天天看點

深入探究N個數組的第K大數是多少

繼上篇​​深入探究第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篇部落格,從前之後以此為:

第一篇:​​初寫求第三大數算法​​

第二篇:​​優化求第三大數算法​​