JAVA中寻找最大的K个数解法

 更新时间:2014年04月18日 09:49:05   作者:  
寻找最大的K个数,这个是面试中比较常见的一道题,网上也有很多例子,在这里是比较传统的解法

这个题拿到之后首先会想到排序,排好序之后在选取选取最大的K个数。排序选择快速排序是个比较好的选择。
好了,让我们来进行第一个解法:快速排序
代码如下
复制代码 代码如下:

public static void quickSort(int[] arr, int start, int end) {
  if (start < end) {
   int key = arr[start];
   int right = start;
   int left = end;
   while (right < left) {
    while (right < left && arr[left] > key) {
     left --;
    }
    if (right < left) {
     arr[right] = arr[left];
    }
    while (right < left && arr[right] <= key) {
     right ++;
    }
    if (right < left) {
     arr[left] = arr[right];
    }
   }
   arr[right] = key;
   quickSort(arr, start, right-1);
   quickSort(arr, left+1, end);
  }
 }
 

快速排序之后,数组会是有序的,上面的排序是从小到大的,所以我们输出应该是下面这样
复制代码 代码如下:
                int k = 4;
  for (int i=arr.length-1; i>=arr.length-k; i--) {
   System.out.println(arr[i]+"  ");
  }

。第一个解法已经好了,但是有没有更好的办法。
答案是有的!我们可以选择部分排序,接下来我们使用选择排序来做解决这个问题。
代码如下:
复制代码 代码如下:
public static int[] selectSortK(int[] arr, int k) {
  if(arr == null || arr.length == 0) {
   return null;
  }
  int[] newArr = new int[k];
  List<Integer> list = new ArrayList<Integer>();//记录每次最大数的下标
  for (int i=0; i<k; i++) {
   int maxValue = Integer.MIN_VALUE; //最大值
   int maxIndex = i;
   for (int j=0; j<arr.length; j++) {
    if (arr[j] > maxValue && !list.contains(j) ) {
     maxValue = arr[j];
     maxIndex = j;
    }
   }
   if (!list.contains(maxIndex)) {//如果不存在,就加入
    list.add(maxIndex);
    newArr[i] = maxValue;
   }
  }
  return newArr;
 }

相关文章

  • Spring MVC之@RequestMapping注解详解

    Spring MVC之@RequestMapping注解详解

    本篇文章主要介绍了Spring MVC之@RequestMapping 详解,RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。有兴趣的可以了解一下。
    2017-01-01
  • 从JVM分析Java的类的加载和卸载机制

    从JVM分析Java的类的加载和卸载机制

    这篇文章主要介绍了从JVM分析Java的类的加载和卸载机制,讲解了Java类的声明周期,需要的朋友可以参考下
    2015-11-11
  • springboot使用log4j2异步日志提升性能的实现方式

    springboot使用log4j2异步日志提升性能的实现方式

    这篇文章主要介绍了springboot使用log4j2异步日志提升性能,异步日志实现方式:将日志存入一个单独的队列中,有一个单独的线程从队列中获取日志并写入磁盘文件,需要的朋友可以参考下
    2022-05-05
  • JavaWeb response完成重定向实现过程详解

    JavaWeb response完成重定向实现过程详解

    这篇文章主要介绍了JavaWeb response完成重定向实现过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • Java基础教程之构造器与方法重载

    Java基础教程之构造器与方法重载

    这篇文章主要介绍了Java基础教程之构造器与方法重载,构造器可以初始化数据成员,还可以规定特定的操作,本文还对方法重载做了介绍,需要的朋友可以参考下
    2014-08-08
  • spring ioc的简单实例及bean的作用域属性解析

    spring ioc的简单实例及bean的作用域属性解析

    这篇文章主要介绍了spring ioc的简单实例及bean的作用域属性解析,具有一定借鉴价值,需要的朋友可以参考下
    2017-12-12
  • springMVC几种页面跳转方式小结

    springMVC几种页面跳转方式小结

    本篇文章主要介绍了springMVC 几种页面跳转方式,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • mybatis-plus实体类中出现非数据库映射字段解决办法

    mybatis-plus实体类中出现非数据库映射字段解决办法

    这篇文章主要介绍了mybatis-plus实体类中出现非数据库映射字段解决办法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • Java设计模式之原型设计示例详解

    Java设计模式之原型设计示例详解

    这篇文章主要为大家详细介绍了Java的原型设计模式,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • Mybatis基于注解与XML开发使用流程

    Mybatis基于注解与XML开发使用流程

    MyBatis是Java的持久化框架,目的是为了使操作数据库更加方便、灵活、高效,可以通过Java注解和XML文件来映射Java对象和SQL语句,提供了非常灵活的SQL编写方式和动态SQL语句的创建方式,这篇文章主要介绍了Mybatis基于注解与XML开发,需要的朋友可以参考下
    2023-07-07

最新评论