总时间限制: 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. PHP 5.4.17 发布!

    PHP 5.4.17发布.2013-07-04 经过1个RC 上个版本是2013-06-07的5.4.16.修正了大约20个Bug以及几个安全漏洞.尽管5.5.0正式版已经发布.但5.4还未停止更新. ...

  2. jdk环境变量配置 java环境变量配置

    进行java开发,首先要安装jdk,安装了jdk后还要进行环境变量配置: 1.下载jdk(http://java.sun.com/javase/downloads/index.jsp),我下载的版本是 ...

  3. 用java打暴雪星际争霸(2)——执行測试机器人

    原创内容.转载请注明. 在上一节安装完成后.或者您直接打开我分享的虚拟机后,我如今将解说怎样启动測试机器人. 第一步,打开Eclipse,导入机器人演示样例项目,如图所看到的. 第二步,我们能够看到就 ...

  4. OpenWRT - WEB界面开发思路和基本方法

    想要对OpenWRT的WEB界面(*下称界面)进行修改.修改的目标是: 1.修改页面的样式,设计为企业的风格(stylesheet) 2.新建自己的功能,实现 访问页面后,用户就可以对配置文件(也就是 ...

  5. 对于DQN的三大改进 - 这篇讲的好些

    可以看这篇文章: https://blog.csdn.net/u013236946/article/details/73161586 这篇也讲的不错: https://www.cnblogs.com/ ...

  6. 开启Remote Desktop的PowerShell

    1) Enable Remote Desktop set-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Terminal Ser ...

  7. android 桌面小工具(Widget)开发教程

    刚学做了哥Widget,感觉不错哦,先来秀下效果(用朋友手机截的图) 这个Widget会每隔5秒钟自动切换内容和图片,图片最好使用小图,大图会导致你手机桌面(UI)线程卡顿 教程开始: 1.首先创建一 ...

  8. 从VMware虚拟机安装到hadoop集群环境配置详细说明(第一期)

    http://blog.csdn.net/whaoxysh/article/details/17755555 虚拟机安装 我安装的虚拟机版本是VMware Workstation 8.04,自己电脑上 ...

  9. Log4j日志体系结构

    转自:https://my.oschina.net/andylucc/blog/794867 摘要 我们在写日志的时候首先要获取logger,在每一个使用log4j的项目都有很多个地方要获取logge ...

  10. logstash启动脚本

    1  nohup ./redis-server 1>log.log 2>error.log &  2 nohup ./elasticsearch -f & 3 nohup ...