输出前 k 大的数
- 总时间限制: 10000ms 单个测试点时间限制: 1000ms 内存限制: 65536kB
- 描述
-
给定一个数组,统计前k大的数并且把这k个数从大到小输出。
- 输入
- 第一行包含一个整数n,表示数组的大小。n < 100000。
第二行包含n个整数,表示数组的元素,整数之间以一个空格分开。每个整数的绝对值不超过100000000。
第三行包含一个整数k。k < n。 - 输出
- 从大到小输出前k大的数,每个数一行。
- 样例输入
-
10
4 5 6 9 8 7 1 2 3 0
5 - 样例输出
-
9
8
7
6
5
分析:
按照快速排序的思想,把数组前k大的数放到数组末尾。然后在对数组末尾k个元素做排序再输出该部分元素。
#include<stdio.h>
#include<stdlib.h> int a[]; int cmp(const void *a,const void *b)
{ return (*(int *)a) - (*(int *)b); } //将a[]数组下标区间[start,end]前k大的数放到数组下标在[start,end]范围的末尾部分.
void FindMaxK(int a[],int start,int End,int k)
{
if(start-End+==k) return;//若是元素个数刚好就是k个,则可以直接返回.
int i=start,j=End,key=a[start];
while(i<j)
{
while(i<j&&a[j]>=key) --j;
a[i]=a[j];
while(i<j&&a[i]<=key) ++i;
a[j]=a[i];
}
a[i]=key;
if(End-i+==k) return;//数组后半段的元素个数为End-i+1,刚好够k个
else if( End-i+ > k) FindMaxK(a,i+,End,k);//数组后半段的元素个数多于k个
else FindMaxK(a,start,i-,k-(End-i+) );//数组后半段元素个数不够k个。所以要在前半段继续寻找k-(End-i+1)这么多个。
}
int main()
{
int n,k; scanf("%d",&n);
for(int i = ;i <n; ++i) scanf("%d",&a[i]);
scanf("%d",&k); FindMaxK(a,,n-,k); qsort(a+n-k,k,sizeof(a[]),cmp);
for(int i = n-;i >= n-k; --i) printf("%d\n",a[i]);
return ;
}
C ++版:(北大郭炜老师)
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std; int a[]; void swap(int & a,int & b)
{ int tmp = a; a = b; b = tmp; } //将a[]数组下标区间[start,end]前k大的数放到数组下标在[start,end]范围的末尾部分.
void FindMaxK(int a[],int start,int End,int k)
{
if(start-End+==k) return;//若是元素个数刚好就是k个,则可以直接返回.
int i=start,j=End,key=a[start];
while(i<j)
{
while(i<j&&a[j]>=key) --j;
swap(a[i],a[j]);
while(i<j&&a[i]<=key) ++i;
swap(a[i],a[j]);
}
if(End-i+==k) return;//数组后半段的元素个数为End-i+1,刚好够k个
else if( End-i+ > k) FindMaxK(a,i+,End,k);//数组后半段的元素个数多于k个
else FindMaxK(a,start,i-,k-(End-i+) );//数组后半段元素个数不够k个。所以要在前半段继续寻找k-(End-i+1)这么多个。
}
int main()
{
int n,k; scanf("%d",&n);
for(int i = ;i <n; ++i) scanf("%d",&a[i]);
scanf("%d",&k); FindMaxK(a,,n-,k); sort(a+n-k-,a+n);
for(int i = n-;i >= n-k; --i)
printf("%d\n",a[i]);
return ;
}
本问题可以参考阅读:
http://www.cnblogs.com/macher/p/5317439.html
http://www.cnblogs.com/huashanqingzhu/p/6591091.html
输出前 k 大的数的更多相关文章
- 7617:输出前k大的数
7617:输出前k大的数 查看 提交 统计 提问 总时间限制: 10000ms 单个测试点时间限制: 1000ms 内存限制: 65536kB 描述 给定一个数组,统计前k大的数并且把这k个数从大到小 ...
- 输出前k大的数
总时间限制: 10000ms单个测试点时间限制:1000ms内存限制:65536kB(noi) 描述 给定一个数组,统计前k大的数并且把这k个数从大到小输出. 输入 第一行包含一个整数n,表示数组的大 ...
- 【分治】输出前k大的数
描述 给定一个数组,统计前k大的数并且把这k个数从大到小输出. 输入第一行包含一个整数n,表示数组的大小.n < 100000.第二行包含n个整数,表示数组的元素,整数之间以一个空格分开.每个整 ...
- OpenJ_Bailian 7617 输出前k大的数
题目传送门 OpenJ_Bailian 7617 描述 给定一个数组,统计前k大的数并且把这k个数从大到小输出. 输入 第一行包含一个整数n,表示数组的大小.n < 100000.第二行包含n个 ...
- noi 统计前k大的数
描述 给定一个数组,统计前k大的数并且把这k个数从大到小输出. 输入 第一行包含一个整数n,表示数组的大小.n < 100000. 第二行包含n个整数,表示数组的元素,整数之间以一个空格分开.每 ...
- 输出前n大的数(分治)
描述:给定一个数组包含n个元素,统计前m大的数并且把这m个数从大到小输 出. 输入: 第一行包含一个整数n,表示数组的大小.n < 100000.第二行包含n个整数,表示数组的元素,整数之间以一 ...
- (分治)输出前m大的数。。。
描述给定一个数组包含n个元素,统计前m大的数并且把这m个数从大到小输出.输入第一行包含一个整数n,表示数组的大小.n < 100000.第二行包含n个整数,表示数组的元素,整数之间以一个空格分开 ...
- 第k大的数,前k大的数
1.排序后去出前k个,o(n*log(n)) 如果k<log(n),可以考虑直接选择排序,因为只需要执行找到第k个就可以结束 o(n*k) 2.o(nlog(k))快排把数分为了两个部分, ...
- pandas取前K大的数,sort_values()和nlargest()速度比较
排序量比较大时: 数据量比较小时: 所以结论就是: 数据量大时选用nlargest,数据量小时选用sort_values() 具体数据量怎么算大:10000条时两个方法的时间差不多,所以可以按1000 ...
随机推荐
- iOS开发-UIScrollView图片无限循环
关于UIScrollView图片浏览的例子有很多,之前也写过类似方面的文章,关于UIScrollView的图片循环在新闻类的App基本上是比较常见的一种情况就是图片浏览,然后根据不同的图片显示不同的内 ...
- AS 功能 设置 SDK AVD 简介 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- mybatis xml mapper 文件中 if-else 写法
mybaits 中没有else要用chose when otherwise 代替 范例一 <!--批量插入用户--> <insert id="insertBusinessU ...
- 集成学习总结 & Stacking方法详解
http://blog.csdn.net/willduan1/article/details/73618677 集成学习主要分为 bagging, boosting 和 stacking方法.本文主要 ...
- 【大数据】基于Hadoop的HBase的安装(转)
https://note.youdao.com/share/?id=c27485373a08517f7ad2e7ec901cd8d5&type=note#/ 安装前先确认HBse和Hadoop ...
- 【大数据】MongoDB安装(转)
https://note.youdao.com/share/?id=40be7f77434910e8860c5fd1ef5d24fe&type=note#/ MongoDB安装 环境 Cent ...
- Cognos11第三方权限认证之OpenDJ
一.安装OpenDJ 安装java环境,配置OPENDJ_JAVA_HOME环境变量指向java,然后傻瓜安装,出现下面的界面则说明安装成功 注意安装的过程中会指定管理用户cn的密码,默认的cn是 ...
- (转)在NGUI使用图片文字(数字、美术字)(直接可用于UILable)
本文永久地址:http://www.omuying.com/article/24.aspx,[文章转载请注明出处!] 在 Unity 开发过程中,我们经常会使用到美术提供的图片文字(数字)来美化我们的 ...
- Logistic 回归梯度上升优化函数
In [183]: def loadDataSet(): dataMat = [] labelMat = [] fr = open('testSet.txt') for line ...
- Effective JavaScript Item 63 注意异步调用中可能会被忽略的异常
异常处理是异步编程的一个难点. 在同步的代码中,异常可以非常easy地通过try catch语句来完毕: try { f(); g(); h(); } catch (e) { // handle an ...