题目:有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数。

给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在。

测试样例:
[1,3,5,2,2],5,3返回:
2

方法一:

利用冒泡排序,进行k趟排序,即可查找到第k大的数(每趟冒泡排序都寻找当前序列中的最大值)

方法二:

利用选择排序,进行k趟排序,即可查找到第k大的数(每趟选择排序都寻找当前序列中的最大值)

方法三:

利用快速排序的思想,只需找到第k大的数,不必把所有的数排好序。

思路分析:先任取一个数(找到基准值),把比它大的数移动到它的右边,比它小的数移动到它的左边。移动完成一轮后,看该数的下标(从0计数),如果刚好为length-k,则它就是第k大的数(因为移动后的基准值左边都是比它小的数,右边都是比他大的数,右边若没有元素,则说明当前基准值是第1大元素,若右边有1个元素,则说明当前基准值是第2大元素,若右边有2个元素,则说明当前基准值是第3大元素......即当前基准值右边有k-1个元素,或当前基准值的下标为length-k,则说明当前基准值是第k大元素),如果小于length-k,说明第k大的数在它右边,如果大于length-k,则说明第k大的数在它左边,取左边或者右边继续进行移动,直到找到。

代码实现:

package com.csu.marden;public class Demo6 {public static void main(String[] args) {int [] arr={3,1,2,5,4,7,6};int k=2;System.out.println(quickSort(arr, 0, arr.length-1, k));}//使用快速排序的原理,寻找第k大的数public static int quickSort(int [] arr,int start,int end,int k){//递归结束条件if(start>end){return -1;}int i=start;int j=end;int base=arr[start];while(i<j){while(i<j && arr[j]>=base){j--;}while(i<j && arr[i]<=base){i++;}if(i<j){int temp=arr[j];arr[j]=arr[i];arr[i]=temp;}}//此时i=j,交换base元素的位置arr[start]=arr[i];arr[i]=base;if(i==arr.length-k){//查找到第k大的数字return arr[i];}else if(i<arr.length-k){//在基准值右边寻找return quickSort(arr, i+1, end, k);}else{//在基准值左边寻找return quickSort(arr, start, i-1, k);}}}

方法四:

针对海量数据,数据量太大无法加载到内存,若采用上述方法,必须将所有数据加载到内存进行排序,尤其是快速排序,使用递归需要额外的空间开销,此时可以使用堆排序,利用较少的空间即可找到第k大的数。

思路分析:

寻找第k大的数,可以在内存中构建一个包含k个数的小顶堆(堆顶元素是最小值),然后从外存中第k+1个数据开始,依次与小顶堆的堆顶元素进行比较,若该数比堆顶元素大,则用该数替换堆顶元素,并重新构建小顶堆,重复上述操作,直到外存中的所有数据遍历完成,此时小顶堆的堆顶元素即为第k大的数。

寻找数组中第k大的数相关推荐

  1. Leetcode215 寻找数组中第K大的数

    题目描述 给定一个数组A,要求找到数组A中第K大的数字. 思路:对于这种题目,其实有多种解法 方法1:对数组A进行排序,然后遍历一遍就可以找到第K大的数字.该方法的时间复杂度为O(N*logN) 方法 ...

  2. java查找第k大的数字_[经典算法题]寻找数组中第K大的数的方法总结

    今天看算法分析是,看到一个这样的问题,就是在一堆数据中查找到第k个大的值. 名称是:设计一组N个数,确定其中第k个最大值,这是一个选择问题,当然,解决这个问题的方法很多,本人在网上搜索了一番,查找到以 ...

  3. java寻找数组中第k大的数

    快速排序思想,先找数组第k小的数,当执行一次partition函数找到index下标时,index左边的数比arr[index]小,右边的数比arr[index]大 public class Test ...

  4. 寻找数组中第K大的数,时间复杂度O(N)

    给定一个数组A,要求找到数组A中第K大的数字.对于这个问题,解决方案有不少,此处我只给出三种: 有道题目寻找第K大,我用这3种方法都做了一遍. 方法1: 对数组A进行排序,然后遍历一遍就可以找到第K大 ...

  5. python查找第k大的数_寻找数组中第K大的数

    给定一个数组A,要求找到数组A中第K大的数字.对于这个问题,解决方案有不少,此处我只给出三种: 方法1: 对数组A进行排序,然后遍历一遍就可以找到第K大的数字.该方法的时间复杂度为O(N*logN) ...

  6. java查找第k大的数字_查找数组中第k大的数

    问题:  查找出一给定数组中第k大的数.例如[3,2,7,1,8,9,6,5,4],第1大的数是9,第2大的数是8-- 思考:1. 直接从大到小排序,排好序后,第k大的数就是arr[k-1]. 2. ...

  7. Leetcode215数组中第k大的数-最小堆

    题目 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 输出 ...

  8. 找出数组中第k大的数

    给定一个数组,找出数组中第k大的数.其实现代码如下: package com.threeTop.www;/*** 找出数组中第k大的数* @author wjgs**/ public class Fi ...

  9. Java找出数组中第K大的数

    题目描述 有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数. 给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在. 测试样例: [1,3,5 ...

最新文章

  1. RTP:实时应用程序传输协议
  2. 成为Apache顶级项目核心贡献者是一种什么样的体验?
  3. Windows下使用Java API操作HDFS的常用方法
  4. [大数据]-Fscrawler导入文件(txt,html,pdf,worf...)到Elasticsearch5.3.1并配置同义词过滤...
  5. 7-25 朋友圈 (25 分)(详解+并查集的了解和应用)
  6. Java开发必须掌握的8种网站攻防技术
  7. 【转】1:C#的三种异步的详细介绍及实现
  8. 华为消息推送 有透传通道吗_求解在推送用透传消息-使用厂商通道(我用的是基座测试) 用手机测试出现了“clientId离线”问题...
  9. S5PV210 软件实现电阻屏两点触摸
  10. String、StringBuffer 、StringBuilder 的区别(转)
  11. Javascript特效:字体火焰背景
  12. java jtable 自动高度,自动调整JTable中行的高度
  13. golang清空切片
  14. java进制转换所有方法_Java进制转换方法整理
  15. 【统计学】基本Stata使用手册(3):模型设定问题
  16. 【经典传颂】人月神话The Mythical Man-Month
  17. C++20 实现字符串类型的转换操作
  18. 与面试官的一次促膝长谈:人家也是第一次当面试官,你们答不上来我也特别尴尬!
  19. [并查集]BZOJ 1050——[HAOI2006]旅行comf
  20. Origin画图笔记

热门文章

  1. 如何判断JS中两个对象是否相等?
  2. 【技术分享】戴尔工作站安装Win10+Ubuntu20.04双系统教程与避坑指南
  3. 在ubuntu下使用Vim学习C++
  4. [转]普通软件项目开发过程规范(五)—— 总结
  5. 不用标点符号实现加减乘除运算
  6. JDBC的批量处理语句
  7. Netlify前端自动化部署服务
  8. “完全或无”、IND-CPA、IND-CCA1、IND-CCA2的详细说明
  9. react项目如何运行
  10. 病毒Ytnauexu