天天看点

深入探究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篇博客,从前之后以此为:

第一篇:​​初写求第三大数算法​​

第二篇:​​优化求第三大数算法​​