总时间限制: 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 大的数的更多相关文章

  1. 7617:输出前k大的数

    7617:输出前k大的数 查看 提交 统计 提问 总时间限制: 10000ms 单个测试点时间限制: 1000ms 内存限制: 65536kB 描述 给定一个数组,统计前k大的数并且把这k个数从大到小 ...

  2. 输出前k大的数

    总时间限制: 10000ms单个测试点时间限制:1000ms内存限制:65536kB(noi) 描述 给定一个数组,统计前k大的数并且把这k个数从大到小输出. 输入 第一行包含一个整数n,表示数组的大 ...

  3. 【分治】输出前k大的数

    描述 给定一个数组,统计前k大的数并且把这k个数从大到小输出. 输入第一行包含一个整数n,表示数组的大小.n < 100000.第二行包含n个整数,表示数组的元素,整数之间以一个空格分开.每个整 ...

  4. OpenJ_Bailian 7617 输出前k大的数

    题目传送门 OpenJ_Bailian 7617 描述 给定一个数组,统计前k大的数并且把这k个数从大到小输出. 输入 第一行包含一个整数n,表示数组的大小.n < 100000.第二行包含n个 ...

  5. noi 统计前k大的数

    描述 给定一个数组,统计前k大的数并且把这k个数从大到小输出. 输入 第一行包含一个整数n,表示数组的大小.n < 100000. 第二行包含n个整数,表示数组的元素,整数之间以一个空格分开.每 ...

  6. 输出前n大的数(分治)

    描述:给定一个数组包含n个元素,统计前m大的数并且把这m个数从大到小输 出. 输入: 第一行包含一个整数n,表示数组的大小.n < 100000.第二行包含n个整数,表示数组的元素,整数之间以一 ...

  7. (分治)输出前m大的数。。。

    描述给定一个数组包含n个元素,统计前m大的数并且把这m个数从大到小输出.输入第一行包含一个整数n,表示数组的大小.n < 100000.第二行包含n个整数,表示数组的元素,整数之间以一个空格分开 ...

  8. 第k大的数,前k大的数

    1.排序后去出前k个,o(n*log(n))    如果k<log(n),可以考虑直接选择排序,因为只需要执行找到第k个就可以结束 o(n*k) 2.o(nlog(k))快排把数分为了两个部分, ...

  9. pandas取前K大的数,sort_values()和nlargest()速度比较

    排序量比较大时: 数据量比较小时: 所以结论就是: 数据量大时选用nlargest,数据量小时选用sort_values() 具体数据量怎么算大:10000条时两个方法的时间差不多,所以可以按1000 ...

随机推荐

  1. android中解决“Dex Loader] Unable to execute dex: Multiple dex files define LXXX”错误

    原因 1. 出现这种问题的主要原因:那就是你的libs下面引用了两个相同功能的包,可能这两个包的版本不一样而已,去掉一个吧,选择一个合适的版本. 2.build path里面包重复引用.

  2. HTML中的转义字符 (转)

    HTML中<, >,&等有特殊含义,(前两个字符用于链接签,&用于转义),不能直接使用.使用这三个字符时,应使用它们的转义序列,如下所示: & 或 & &a ...

  3. Hadoop概念学习系列之Hadoop、Spark学习路线(很值得推荐)

    说在前面的话 此笔,对于仅对于Hadoop和Spark初中学者.高手请忽略! 1 Java基础: 视频方面:          推荐<毕向东JAVA基础视频教程>.学习hadoop不需要过 ...

  4. https://www.cnblogs.com/xubing-613/p/5895948.html

    最近总是需要用matplotlib绘制一些图,由于是新手,所以总是需要去翻书来找怎么用,即使刚用过的,也总是忘.所以,想写一个入门的教程,一方面帮助我自己熟悉这些函数,另一方面有比我还小白的新手可以借 ...

  5. 用Hadoop构建电影推荐系统

    转自:http://blog.fens.me/hadoop-mapreduce-recommend/ Hadoop家族系列文章,主要介绍Hadoop家族产品,常用的项目包括Hadoop, Hive, ...

  6. VS2010自带的性能分析工具分析.NET程序的性能

    这篇博文给大家分享的是,如何使用VS自带的性能分析工具来分析我们编写的.NET程序,一边找出程序性能的瓶颈,改善代码的质量.在实际开发中,性能真的很重要,往往决定一个产品的生死~良好的用户体验的基础之 ...

  7. (转)Unity3d中的碰撞检测

    很多时候,当我们的主角与其他GameObject发生碰撞时, 我们需要做一些特殊的事情,比如:子弹击中敌人,敌人就得执行一系列的动作.这时,我们就需要检测到碰撞现象,即碰撞检测.这一篇,我来具体谈谈自 ...

  8. python中read() readline()以及readlines()用法

    [转自:http://www.ibm.com/developerworks/cn/linux/sdk/python/python-5/index.html#N1004E] 我们谈到“文本处理”时,我们 ...

  9. [Spring boot] Read values from external properties file

    Let's say we have a extral app.proporites file which contains some extra configuration: // resources ...

  10. python数据结构与算法 29-1 哈希查找

    ).称为哈希查找. 要做到这种性能,我们要知道元素的可能位置.假设每一个元素就在他应该在的位置上,那么要查找的时候仅仅须要一次比較得到有没有的答案,但以下将会看到.不是这么回事. 到10. water ...