找出整数中第k大的数
一 问题描述:
找出 m 个整数中第 k(0<k<m+1)大的整数。
二 举例:
假设有 12 个整数:data[1, 4, -1, -4, 9, 8, 0, 3, -8, 11, 2, -9],请找出第 5 大的数(容易知道是0)。
三 算法思路:
一种基于快排思想的算法可以在 O(n) 复杂度内找到第k大的数,首先要知道 partition 这个函数,它可以调整一个序列
使小于 key 的元素都排在 key 左边,大于 key 的元素都排在 key 右边,key 可以在这个序列中任意选择,一般选择给定序
列的首元素。
partition函数的一般形式:
int partition (int * data, int low, int high)
其中 low 和 high 分别是给定下标的上下边界。
先举例说明,调用 partition (data, 1, 8),就是要将 data 中从 data[1] 到 data[8] 之间的序列分为两部分
截取的序列:data[2] -- data[8],为 4, -1, -4, 9, 8, 0, 3, -8
key 选取第一个数: key = 4
调用 partition(data, 2, 8) 后,这个序列变为: -8, -1, -4, 3, 0, 4, 8, 9
需要注意的是,data[1] 到 data[8] 这个序列片段在原来 data[0] 到 data[11] 这个大序列中已经发生改变,而其他
没有截取到的片段保持不变。
partition 的算法步骤如下:
1 设置两个下标left和right,left = low,right = high
此时left指向4,也是key元素,right指向-8
4, -1, -4, 9, 8, 0, 3, -8
2 从right开始寻找一个小于key的数,它是-8,找到后将它赋值给left所在位置
4, -1, -4, 9, 8, 0, 3, -8 --找到是-8
-8, -1, -4, 9, 8, 0, 3, -8 --赋值到4的位置,
注意key元素4在这些步骤之前就已经保存
3 从left开始寻找一个比key大的元素,它是9,把它赋值给right所在位置
-8, -1, -4, 9, 8, 0, 3, -8 --找到是9
-8, -1, -4, 9, 8, 0, 3, 9 --赋值到-8的位置
重复步骤2,再次从right开始寻找一个小于key的数,它是3,将它赋值给left所在位置
-8, -1, -4, 9, 8, 0, 3, 9 --找到是3
-8, -1, -4, 3, 8, 0, 3, 9 --赋值到9的位置
重复步骤3,再次从left开始寻找一个大于key的数,它是8,将它赋值到right指向的位置
-8, -1, -4, 3, 8, 0, 3, 9 --找到是8
-8, -1, -4, 3, 8, 0, 8, 9 --赋值到3的位置
重复步骤2,再次从right开始寻找一个小于key的数,它是0,将它赋值给left所在位置
-8, -1, -4, 3, 8, 0, 8, 9 --找到是0
-8, -1, -4, 3, 0, 0, 8, 9 --赋值8的位置
重复步骤3,再次从left开始寻找一个大于key的数,现在left指向0,left++后,会发现left == right,
所以现在要退出循环,并把key元素赋值为left所在位置
-8, -1, -4, 3, 0, 4, 8, 9 --完成了最后一步
找出整数中第k大的数的更多相关文章
- 前端算法题:找出数组中第k大的数字出现多少次
题目:给定一个一维数组,如[1,2,4,4,3,5],找出数组中第k大的数字出现多少次. 例如:第2大的数是4,出现2次,最后输出 4,2 function getNum(arr, k){ // 数组 ...
- 算法题之找出数组里第K大的数
问题:找出一个数组里面前K个最大数. 解法一(直接解法): 对数组用快速排序,然后直接挑出第k大的数.这种方法的时间复杂度是O(Nlog(N)).N为原数组长度. 这个解法含有很多冗余,因为把整个数组 ...
- #7 找出数组中第k小的数
「HW面试题」 [题目] 给定一个整数数组,如何快速地求出该数组中第k小的数.假如数组为[4,0,1,0,2,3],那么第三小的元素是1 [题目分析] 这道题涉及整数列表排序问题,直接使用sort方法 ...
- 215. Kth Largest Element in an Array找出数组中第k大的值
堆排序做的,没有全部排序,找到第k个就结束 public int findKthLargest(int[] nums, int k) { int num = 0; if (nums.length &l ...
- 寻找数列中第k大的数算法分析
问题描述:给定一系列数{a1,a2,...,an},这些数无序的,现在求第k大的数. 看到这个问题,首先想到的是先排序,然后直接输出第k大的数,于是得到啦基于排序的算法 算法一: #include&l ...
- [经典算法题]寻找数组中第K大的数的方法总结
[经典算法题]寻找数组中第K大的数的方法总结 责任编辑:admin 日期:2012-11-26 字体:[大 中 小] 打印复制链接我要评论 今天看算法分析是,看到一个这样的问题,就是在一堆数据 ...
- 查找数组中第k大的数
问题: 查找出一给定数组中第k大的数.例如[3,2,7,1,8,9,6,5,4],第1大的数是9,第2大的数是8-- 思考:1. 直接从大到小排序,排好序后,第k大的数就是arr[k-1]. 2. ...
- 找出数组中出现次数超过一半的数,现在有一个数组,已知一个数出现的次数超过了一半,请用O(n)的复杂度的算法找出这个数
找出数组中出现次数超过一半的数,现在有一个数组,已知一个数出现的次数超过了一半,请用O(n)的复杂度的算法找出这个数 #include<iostream>using namespace s ...
- 求数列中第K大的数
原创 利用到快速排序的思想,快速排序思想:https://www.cnblogs.com/chiweiming/p/9188984.html array代表存放数列的数组,K代表第K大的数,mid代表 ...
随机推荐
- Service Locator 模式
什么是Service Locator 模式? 服务定位模式(Service Locator Pattern)是一种软件开发中的设计模式,通过应用强大的抽象层,可对涉及尝试获取一个服务的过程进行封装.该 ...
- -_-#flash播放器自适应
设置断点,几个断点下的固定布局
- HDU 5927 Auxiliary Set 【DFS+树】(2016CCPC东北地区大学生程序设计竞赛)
Auxiliary Set Time Limit: 9000/4500 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Tot ...
- WIA Property Constant Definitions
(@http://msdn.microsoft.com/en-us/library/windows/desktop/ms630202(v=vs.85).aspx): const DeviceID = ...
- maya绝招(1-20)
第一招 自制MAYA启动界面 在安装目录下的BIN文件夹中的MayaRes.dll文件,用Resource Hacker打开.在软件的目录树中找到“位图”下的MAYASTARTUPIMAGE.XPM并 ...
- mysql使用mysqldump导出数据出错
mysqldump -hlocalhost -uroot -p123456 student_info jssypk > c:/databackup.sql 导出表结构 mysqldump - ...
- 《A First Course in Probability》-chaper5-连续型随机变量-随机变量函数的期望
在关于离散型随机变量函数的期望的讨论中,我们很容易就得到了如下的等式: 那么推广到连续型随机变量,是否也存在类似的规律呢? 即对于连续型随机变量函数的期望,有: 这里给出一个局部的证明过程,完整的证明 ...
- Java GC 专家系列5:Java应用性能优化的原则
本文是GC专家系列中的第五篇.在第一篇理解Java垃圾回收中我们学习了几种不同的GC算法的处理过程,GC的工作方式,新生代与老年代的区别.所以,你应该已经了解了JDK 7中的5种GC类型,以及每种GC ...
- 在SQL Server 2012中如何使用分组集
作者:Itzik Ben-Gan 翻译:张洪举 此文摘自作者的<Microsoft SQL Server 2012 T-SQL基础>. 分组集就是你据以分组的一个属性集.传统上,SQL中 ...
- CentOS 7 安装和配置JDK
1.下载linux版的JDk 2.cd /usr/local 目录下,上传刚刚下载jdk文件 3.rpm -ivh jdk-8u111-linux-x64.rpm 4.设置环境变量 找到profile ...