第k大的数
问题描述:输入一组数,指定一个k,输出这组数里第k大的数。
一般这种题目,第一想法是把整个数组先排序后,再选取第k位的数。
但是这样做实际上浪费了大量的时间在排序上,我们只是要求第k大的数,并非要把整个数组排序完。
利用快速排序算法的性质:每一趟排序,必有一个元素位于最终的位置,而且于此同时这个元素左边部分的元素都比它小,右边部分的元素都比它大,在这个算法的基础上加以修改:
我们直接将每次选取的元素最终所在位置m与我们想要比较的位置号k相比较。
若m比k大,说明第k大元素必然在m的左方,此时缩小下一趟排序的上界:high=middle-1;
反之(k比m大),说明第k大元素必然在m的右方,此时放大下一趟排序的下界:low=middle+1;
这样就可以在不需要把整个数组元素都排序完的情况下求出第k大的数。
#include<iostream>
#include<cstdio>
#define maxn 10001
using namespace std;
int arr[maxn];
int quicksort(int a[],int low,int high)
{
int pivot=a[low];//选取最低位置上的元素作为枢纽元素
for(;;)
{
while(low<high&&pivot<=a[high]) high--;
if(low>=high)break;
a[low++]=a[high];
while(low<high&&a[low]<=pivot)
low++;
if(low>=high)break;
a[high--]=a[low];
}
a[high]=pivot;
return high;//返回最后元素所在位置
}
int selectk(int a[],int low,int high,int k)
{
int index;
for(;;)
{
index=quicksort(a,low,high);
if(index==k) return a[k];
else if(index<k)
low=index+;
else high=index-;
}
}
int main()
{
int n,x,ans;
while(scanf("%d%d",&n,&x)!=EOF)
{
for(int i=;i<n;i++)
scanf("%d",&arr[i]);
ans=selectk(arr,,n-,x-);
cout<<ans<<endl;
}
return ;
}
第k大的数的更多相关文章
- POJ 2985 The k-th Largest Group(树状数组 并查集/查找第k大的数)
传送门 The k-th Largest Group Time Limit: 2000MS Memory Limit: 131072K Total Submissions: 8690 Acce ...
- 51nod p1175 区间中第K大的数
1175 区间中第K大的数 基准时间限制:1 秒 空间限制:131072 KB 分值: 160 难度:6级算法题 一个长度为N的整数序列,编号0 - N - 1.进行Q次查询,查询编号i至j的所有 ...
- 寻找第K大的数
在一堆数据中查找到第k个大的值. 名称是:设计一组N个数,确定其中第k个最大值,这是一个选择问题,解决这个问题的方法很多. 所谓“第(前)k大数问题”指的是在长度为n(n>=k)的乱序数组中S找 ...
- 找第k大的数
(找第k大的数) 给定一个长度为1,000,000的无序正整数序列,以及另一个数n(1<=n<=1000000),接下来以类似快速排序的方法找到序列中第n大的数(关于第n大的数:例如序列{ ...
- 51nod1175 区间中第K大的数
裸的主席树. #include<cstdio> #include<cstring> #include<cctype> #include<algorithm&g ...
- [51NOD1105]第k大的数(二分答案)
题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1105 先排序,二分上下界分别是最小的两个数和最大的两个数的乘积 ...
- 找出整数中第k大的数
一 问题描述: 找出 m 个整数中第 k(0<k<m+1)大的整数. 二 举例: 假设有 12 个整数:data[1, 4, -1, -4, 9, 8, 0, 3, -8, 11, 2 ...
- 【算法与数据结构】在n个数中取第k大的数(基础篇)
(转载请注明出处:http://blog.csdn.net/buptgshengod) 题目介绍 在n个数中取第k大的数(基础篇),之所以叫基础篇是因为还有很多更高级的算法,这些 ...
- 寻找数列中第k大的数算法分析
问题描述:给定一系列数{a1,a2,...,an},这些数无序的,现在求第k大的数. 看到这个问题,首先想到的是先排序,然后直接输出第k大的数,于是得到啦基于排序的算法 算法一: #include&l ...
- 51nod 区间中第K大的数
区间中第K大的数 基准时间限制:1 秒 空间限制:131072 KB 一个长度为N的整数序列,编号0 - N - 1.进行Q次查询,查询编号i至j的所有数中,第K大的数是多少. 例如: 1 7 6 ...
随机推荐
- Redis模块开发示例
实现一个Redis module,支持两个扩展命令: 1) 可同时对hash的多个field进行incr操作: 2) incrby同时设置一个key的过期时间 在没有module之前,需要借助eval ...
- 浮点型转整数型进行计算 - 移动GIS设备硬件的原因
在ArcGIS9.1之前桌面版ArcGIS都是采用整数存储的,是为了效率,将浮点型转为整数型存储,但9.2之后随着硬件的提升,浮点型的效率已经得到提高了,所以不再转换.但移动GIS设备还是要转整数型. ...
- 【转】require.js学习笔记(一)
一.立即执行函数 立即执行函数可以有效避免临时变量污染全局空间.可以在页面初始化时,在立即执行函数内实现一次执行变量的定义及使用. for (var i = 0; i < elems.lengt ...
- Android SimpleAdapter ViewBinder
- Form表单中的action提交路径问题
Form表单中的action提交路径问题 Form表单action属性和method属性的一些问题: 我遇到的是Form表单提交到servelet处理时遇到的问题:(1)<form name=& ...
- 一个前端小白,关于vue\react等框架下table的应用总结
出来实习一个月多,对于前端,运用相关的最多的就是table,想总结一下先关的内容 一.table提供的功能 1.显示表 2.可编辑:分为可编辑行和可编辑块,但是原理都一样就是设置一个flag,true ...
- ASP.NET实现头像剪切保存
利用swfupload上传头像,利用Jcrop来实现头像在线选择,然后提交个ashx对原头像进行剪切.代码如下: default.aspx: <%@ Page Language="C# ...
- 一个DELPHI操作USB摄像头类
最近在使用Usb摄像头做了个项目,其中写了一个操作usb摄像头类分享给大家 {*******************************************************} { } ...
- 关于getProperties的一点记录
写了一很简单的获取配置文件的代码,结果怎么都在报空指针,经过上网查,直到要这样写才不会报: InputStream is = getClass().getClassLoader().getResour ...
- fping常用参数介绍
fping的主要参数有以下两个: -a:只显示存活主机: -u:只显示不存活主机: -l:循环ping目标IP地址的输入方式: fping IP1 IP2 IP3 ...: fping -f file ...