【分治】输出前k大的数
描述
给定一个数组,统计前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 排序后再输出,复杂度 O(nlogn)
用分治处理: 复杂度 O(n+mlogm)
思路:把前m大的都弄到数组最右边,然后对这最右边m个元素排序,
再输出
关键 : 利用快排思想在O(n)时间内实现把前m大的都弄到数组最右边
#include<iostream>
using namespace std;
int n;
int a[];
int k;
int partition(int s, int e)
{
int key = a[s];
int i = s;
int j = e;
while (i < j)
{
while (a[j] >= key & i < j)
{
j--;
}
while (a[i] <= key & i < j)
{
i++;
}
swap(a[i], a[j]);
}
if (a[i] < key)
{
swap(a[s], a[i]);
}
else
swap(a[s], a[i - ]);
return i;
}
void quickSort(int s,int e)
{
if (s < e)
{
int m = partition(s, e);
quickSort(s, m - );
quickSort(m+, e);
}
}
void arrangeRight(int s,int e,int k)
{
if (e - s + == k)//如果要找到大数个数就是数组长度,不进行操作,直接排序
{
return;
}
//找一个基准数,使比这个数大的都在右边,小的都在左边
int key = a[s];
int i = s;
int j = e;
while (i < j)
{
while ((a[j] >= key) && (i < j))
{
j--;
}
while ((a[i] <= key) &&( i < j))
{
i++;
}
swap(a[i], a[j]);
}
if (a[i] < key)
{
swap(a[s], a[i]);
}
else
{
swap(a[s],a[i-]);
}
int index = i;//最后基准数的位置
int len = e - index + ;
if (len == k)
{
return;
}
else if (len > k)//找到的大数多余规定的,再往右缩小范围
{
arrangeRight(index+,e,k);
}
else//找到的大数不够k个,往左扩大寻找范围,已找到len个,还差len-m个
{
arrangeRight(s,index-,k-len);
}
}
int main()
{
cin >> n;
for (int i = ; i < n; ++i)
{
cin >> a[i];
}
cin >> k;
arrangeRight(, n - ,k);
quickSort(n-k,n-);
for (int i = n-; i >= n - k; --i)
{
cout << a[i] << endl;
}
system("pause");
return ;
}
【分治】输出前k大的数的更多相关文章
- OpenJ_Bailian 7617 输出前k大的数
题目传送门 OpenJ_Bailian 7617 描述 给定一个数组,统计前k大的数并且把这k个数从大到小输出. 输入 第一行包含一个整数n,表示数组的大小.n < 100000.第二行包含n个 ...
- 7617:输出前k大的数
7617:输出前k大的数 查看 提交 统计 提问 总时间限制: 10000ms 单个测试点时间限制: 1000ms 内存限制: 65536kB 描述 给定一个数组,统计前k大的数并且把这k个数从大到小 ...
- 输出前 k 大的数
总时间限制: 10000ms 单个测试点时间限制: 1000ms 内存限制: 65536kB 描述 给定一个数组,统计前k大的数并且把这k个数从大到小输出. 输入 第一行包含一个整数n,表示数组的大小 ...
- 输出前k大的数
总时间限制: 10000ms单个测试点时间限制:1000ms内存限制:65536kB(noi) 描述 给定一个数组,统计前k大的数并且把这k个数从大到小输出. 输入 第一行包含一个整数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 ...
随机推荐
- Oracle11.2.0.1升级到11.2.0.3
Oracle数据库升级也并非简单的事,这篇博客,博主对Oracle那点事做了较详细的介绍: http://blog.itpub.net/9599/viewspace-473003/ 我还属于Oracl ...
- AOP切面通知
需要用的基本的jar包: aopalliance-1.0.jaraspectj-1.6.8.jaraspectjweaver-1.6.8.jarcommons-logging-1.1.3.jarspr ...
- [POI2009]救火站Gas
Description 给你一棵树,现在要建立一些消防站,有以下要求: 1. 消防站要建立在节点上,每个节点可能建立不只一个消防站. 2. 每个节点应该被一个消防站管理,这个消防站不一定建立在该节点上 ...
- ACM_素数环(dfs)
Problem Description: 如图所示,环由n个圆组成. 将自然数1,2,...,n分别放入每个圆中,并且两个相邻圆中的数字总和应为素数. 注意:第一个圆圈的数量应该始终为1. Input ...
- win10系统下使用EDGE浏览器找不到Report Builder 启动图标
Win10系统下如果要使用Report Builder,可能存在EDGE浏览器或者Chrome找不到ReportBuilder的启动图标的情况,此时,应以管理员权限运行IE浏览器,即可看到图标.
- java使用正则表达式对注册页面进行验证
package regex; import java.util.Scanner; import java.util.regex.Matcher; import java.util.regex.Patt ...
- AFNetworking2.5使用-转
来自:http://blog.csdn.net/daiyelang/article/details/38434023 官网下载2.5版本:http://afnetworking.com/ 此文章是基于 ...
- thinkphp3.2.3连接sqlserver 2008 R2 数据库
环境: 操作系统——win7 64位旗舰版 PHP——thinkphp 3.23 数据库——Microsoft SQL Server 2008 R2 需要用到的软件: 步骤: 1.搜索SQLSRV30 ...
- 调用wsdl接口,参数是xml格式
1.最近太累了,好困.闲话少许直奔主题吧.上代码 try{ String wsurl = "http://172.16.16.236:9999/xxx/ws/WSService?wsdl&q ...
- ReactJS-0-React介绍
React介绍: React是一个库而不是一个MVC框架,因为React只负责解决MVC框架中V(View)层面的问题,React致力于创建可重用的UI组件.(React is a library f ...