总时间限制: 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. [Link]Gearman分布式任务处理系统

    http://blog.csdn.net/jiao_fuyou/article/category/1745977 http://www.cnblogs.com/cocowool/archive/201 ...

  2. SpringBoot yml 配置 多配置文件,开发环境,生产环境配置文件分开

    原文地址:https://www.cnblogs.com/baoyi/p/SpringBoot_YML.html 1. 在 spring boot 中,有两种配置文件,一种是application.p ...

  3. Android学习资料总结

    从事ASP.NET Web开发两年了,主要是做Web项目(ASP.NET WebForm和ASP.NET MVC),也做过C/S架构的企业内部系统,偶然接触Android,学艺不精,项目没做出什么,倒 ...

  4. VS web.config/app.conifg配置文件自定义类型使用智能感知功能

    大家使用VS编辑web.config或app.config时可以使用智能感知功能的,像下面这样很是方便 当然如果是我们自定义的类型也是可以使用智能感知的,因为智能感知的内容是来自你或其他公司(MS)提 ...

  5. C++之new、delete 与malloc、free的异同

    在C/C++编程中常常会申请内存.而对内存的申请释放操作有两套方法: new.delete 与malloc.free.他们的使用最好是成对使用,不要去混搭---这可不是时尚界哦. 例如以下是这两组方法 ...

  6. virtualBox导入虚拟机启动报错

    今天使用Oracle VMbox在导入虚拟机后,启动时报了如下错误: A new node couldn't be inserted because one with the same name ex ...

  7. Activity设置为对话框属性时(Theme.Dialog)时,改变其在屏幕中的位置

    如果有需要要将Activity变成一个窗口形式(在Manifest.xml中的activity标签设置android:theme="@android:style/Theme.Dialog&q ...

  8. AngularJs - Javascript MVC 框架

    在2012年6月google发布了AngularJs 1.0稳定版, 并宣称:AngularJS可以让你扩展HTML的语法,以便清晰.简洁地表示应用程序中的组件,并允许将标准的HTML作为你的模板语言 ...

  9. DELL平板如何安装WIN10系统 -PE启动问题

    开机按F2可以进入BIOS设置,如果你的系统已经被删了,则开机会自动进入检查程序   进入BIOS之后,可以看到如果改成Legancy,默认第一启动方式是Internal HDD   我如果重装系统, ...

  10. SuperMap开发入门1——资源下载

    前言(废话) 由于项目需要,我们将被改用超图(SuperMap)平台进行GIS开发.记忆中,我还是在学生时代使用过超图软件5.0版本,安装包只有50M,这也是超图与学校有合作关系的缘故. 在以后的学习 ...