【分治】输出前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 ...
随机推荐
- Linux下GCC编译器的安装
通过apt-get方式下载的Qt5.9的gcc编译器版本只是4.8.3,无法打开一些Qt5的库头文件,所以准备在Llinux下再安装一个gcc5.3.0. 查看gcc版本 ubuntu下查看gcc的版 ...
- codeforces 570 E. Pig and Palindromes (DP)
题目链接: 570 E. Pig and Palindromes 题目描述: 有一个n*m的矩阵,每个小格子里面都有一个字母.Peppa the Pig想要从(1,1)到(n, m).因为Peppa ...
- _bzoj2049 [Sdoi2008]Cave 洞穴勘测【LCT】
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2049 裸的LCT,保存LCT模版.说一下出bug的几个地方叭: ①,rotate时,没有判断 ...
- foreach的学习使用归纳
1: 实现对双向链表的遍历使用 LinkedList<string> llary = new LinkedList<string>(); llary.AddLast (&quo ...
- google breakpad 使用初步总结
项目地址:https://code.google.com/p/google-breakpad/ 访问不了请挂VPN 这是一个由google主导的开源项目,官方介绍为:An open-source ...
- [转]访问 OData 服务 (WCF Data Services)
本文转自:http://msdn.microsoft.com/zh-SG/library/dd728283(v=vs.103) WCF 数据服务 支持开放式数据协议 (OData) 将数据作为包含可通 ...
- js 宿主对象的属性和方法总结
(1)属性: //height,width; a=document.documentElement.clientHeight; //文档可视高度,由 ...
- SDK manager.exe 运行时报错:系统找不到指定的文件 android.bat
android studio 2.3.1的 SDK Manager工具 突然没有 Launcher XXX 那个按钮,只好到SDK目录中去启动,无奈发生以下错误. 解决办法:运行android.bat ...
- Android图片压缩,不失真,上线项目
当然了,图片压缩是利用了libjpeg库的基础上,牛逼的同学可以自行生成so.jar.在此给出一个链接: http://www.cnblogs.com/hrlnw/p/4403334.html 在生成 ...
- Python学习 Day 8 继承 多态 Type isinstance dir __slots__
继承和多态 在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类.父类或超类(Base clas ...