算法篇之分治算法--输出前k大个数

C++ 输出前K大的数 1:输出前k大的数 查看 提交 统计 提问 总时间限制:  10000ms   单个测试点时间限制:  1000ms   内存限制:  65536kB 描述 给定一个数组,统计前k大的数并且把这k个数从大到小输出。 输入 第一行包含一个整数n,表示数组的大小。n < 100000。 第二行包含n个整数,表示数组的元素,整数之间以一个空格分开。每个整数的绝对值不超... 阅读详情

例题3:输出前k大的数

描述:给定一个数组包含n个元素,统计前k大的数并且把这k个数从大到小输出。

输入:第一行包含一个整数n,表示数组的大小。n<100000

第二行包含n个整数,表示数组的元素,整数之间以一个空格分开。每个整数的绝对值不超过100000000.

第三行包含一个整数k,k<n.

输出:

从大到小输出前k大的数,每个数一行。

 

解析:

引入操作arrangeRight(k):把数组(或数组的一部分前k大的都弄到最右边

如何将前k大的都弄到最右边?

第一步:设key=a[0],将key挪到适当位置,使的比key小的元素都在key左边,比key大的元素都在key右边。

第二步:选择数组的前部或后部再进行arrangeRight操作

 

/**
输出前m大的数
排序后在输出,复杂度O(nlogn)
用分治后处理,复杂度O(n+mlogm) 
思路:把前m大的都弄到数组最右边,然后对着最右边的m个元素排序后在输出  
*/ 
#include<iostream>
#include<algorithm>
#define maxsize 100010
using namespace std;
void swap(int &a,int &b)
{
	int temp=a;
	a=b;
	b=temp;
}
void arrangeRight(int a[],int left,int right,int k)
{
	if(left>=right)
		return;
	int i=left,j=right,temp=a[i];
	while(i!=j)
	{
		while(i<j&&a[j]>=temp)
			j--;
		swap(a[i],a[j]);
		while(i<j&&a[i]<temp)
			i++;
		swap(a[i],a[j]);
	}
	if(right-i+1==k)//右边部分直接等于k 
		return;
	else if(right-i+1>k)//右边部分比k的个数多
		arrangeRight(a,i+1,right,k);
	else if(right-i+1<k)//右边部分比k的个数少
		arrangeRight(a,left,i-1,k-(right-i+1));
	 
}
int main()
{
	int a[maxsize];
	int n;
	cin>>n;
	for(int i=0;i<n;i++)
		cin>>a[i];
	int k;
	cin>>k;
	arrangeRight(a,0,n-1,k);
	//调用sort函数排序
	sort(a+n-k,a+n); //注意sort函数第一个参数是要排序的数组的起始位置  第二个是要 结束的地址(最后一位要排序的地址的下一位置) 
	for(int i=n-1;i>=n-k;i--)
		cout<<a[i]<<" ";
	cout<<endl;
	return 0; 
}

 

【数据结构】TopK问题 手把手教你TopK算法 阅读详情

相关推荐

分治 001:输出前k大的数

001:输出前k大的数 总时间限制: 10000ms 单个测试点时间限制: 1000ms 内存限制: 65536kB 描述 给定一个数组,统计前k大的数并且把这k个数从大到小输出。 输入 第一行包含一个整数n,表示数组的大小。n < 100000。 第二行包含n个整数,表示数组的元素,整数之间以一个空格分开。每个整数的绝对值不超过100000000。 第三行包含一个整数k。k < n。...

BLUEsang的博客 683

分治专题 输出前k大的数

给定一个数组,统计前k大的数并且把这k个数从大到小输出。 分治:把一个问题分解成形式和原任务相同,但规模更小的几个部分任务(通常是两个部分),分别完成,或只需要选一部分完成。然后再处理完成后的这一个或几个部分的结果,实现整个任务的完成。 把前m大的都弄到数组的右边,然后对最右边的m个元素排序再输出。 O(n)时间内实现把前m大的都弄到数组最右边。 arrangeRinght(int l, in...

H_ang的博客 1438

秒懂算法系列 —— 最小 K 个数 & 分治法

您的点赞和关注是我坚持写作的最大动力,本人正在寻找测试开发的工作机会,欢迎邮件联系 log.v@qq.com 什么是算法范式? 算法范式即算法设计的设计模式,类似软件工程中 GoF 提出的 23 种经典的设计模式,是前人在经历大规模实践后总结的较为通用的解决问题,优化问题的模板,学习和了解算法范式,就可以站在巨人的肩膀上解决问题。常见的算法范式有如下几类: 什么是分治法? 从字面意思理解,分...

qq_15026111的博客 1512

C语言(CED)输出前k大的数(分治法/局部快速排序):给定一个数组,统计前k大的数并且把这k个数从大到小输出。

)输出前k大的数(分治法/局部快速排序):给定一个数组,统计前k大的数并且把这k个数从大到小输出。 [输入] 第一行包含一个整数n,表示数组的大小。 第二行包含n个整数,表示数组的元素,整数之间以一个空格分开。第三行包含一个整数k。k < n。 [输出] 从大到小输出前k大的数,每个数一行。 [样例输入] 10 4 5 6 9 8 7 1 2 3 0 5 [样例输出] ...

Cat 3963

c语言实现分治法求第K大元素(详细解释)

注:本文不对快速排序作任何解释,建议在对快速排序有一定了解后再阅览 一、问题分析 最简单的做法应该是直接选择先将集合排序(比如快速排序),然后直接以k为下标从有序集合中获取。但是这样做时间复杂度其实是比较大的。如果要想要提升一下效率,可以考虑在快速排序的原理下稍微做点修改。 二、修改快排 1、主元素的位置特殊性 在快速排序中,第一步是选取主元素(这里记为x),然后将小于主元素x的数放在x左边,剩下...

weixin_43641850的博客 4360

求排列的逆序数与输出前k大的数(分治算法)

分治把一个任务分解成多个规模更小的任务,能显著改善解决问题的效率。归并排序与快速排序是其典型应用,变形问题有排列的逆序数与输出前k大的数。 一、排列的逆序数 1.问题简述 考虑1,2,…,n的排列 i1,i2,…,in,如果其中存在j,k,满足 j < k 且 ij> ik, 那么就称(ij,ik)是这个排列的一个逆序。一个排列含有逆序的个数称为这个排列的逆序数。 现给定1,2,…,...

hejnhong的博客 772

分治思想——取余运算、折半查找、输出前K个数

题目描述取余运算(算法,分治)输入b,p,k的值,求b^p mod k的值。其中b,p,k×k为长整型数。输入输出格式输入格式 :输入b,p,k的值。输出格式:求b^p mod k的值。输入输出样例输入:2 10 9输出:时间限制:1000ms内存限制:65536KB。

loveabc123ABC的博客 1074

C++ 经典算法题目前k大的数

求一个给定数组的前k个数有多种方法一 方法一:排序取前k个数,时间复杂度nlogn 方法二:维护一个最大堆,时间复杂度nlogn 方法三:维护一个容量为k的最小堆,代码如下,时间复杂度O(nlogk) #include <iostream> #include <vector> #include <queue> std::vector<int&g...

wwxy1995的博客 2704

分治法|输出前k大的数

输出前k大的数(北大MOOC程序设计与算法二 第五周测验) 给定一个数组,统计前k大的数并且把这k个数从大到小输出。 输入 第一行包含一个整数n,表示数组的大小。n < 100000。 第二行包含n个整数,表示数组的元素,整数之间以一个空格分开。每个整数的绝对值不超过100000000。 第三行包含一个整数k。k < n。 输出 从大到小输出前k大的数,每个数一行。 输入样例 10 4...

Hoolys 1513

如何快速获取SAMM、SMIC等主流微表情数据集?完整申请指南(附避坑技巧)

本文提供了获取SAMM、SMIC等主流微表情数据集的完整申请指南,包括申请前的准备工作、分步申请流程、协议谈判技巧以及数据使用与维护策略。特别针对高分辨率动态捕捉和多模态同步数据等热词,帮助研究者高效获取高质量数据集,避免常见陷阱。

weixin_29057163的博客 422

lidar点云比赛-Southlidar软件使用入门

lidar点云比赛-Southlidar软件使用入门 广西高校重点实验室培训基地 系统控制与信息处理重点实验室 本篇博客来自河池学院: 智控无人机小组 写作时间:2020.09.29 一、软件资源及安装 1.下载地址: https://pan.baidu.com/s/1jN1pynmAZOqj5mMx774pVg 提取码:gkvv (资源来自南方测绘) 2.安装 进入链接,找到软件文件夹, 内含文件即为安装包 3.下载成功后按提示安装即可 4.安装成功后桌面自动创建一个快捷方式 二、界面布

qq_49621416的博客 4893

原创 第七章 分治算法-1235:输出前k大的数

1235:输出前k大的数 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 6611 通过数: 2485 【题目描述】 给定一个数组,统计前k大的数并且把这k个数从大到小输出。 【输入】 第一行包含一个整数n,表示数组的大小。n < 100000。 第二行包含n个整数,表示数组的元素,整数之间以一个空格分开。每个整数的绝对值不超过100000000。...

zqhf123的博客 974

通达信波段交易公式实战:如何用副图指标精准捕捉买卖点(附完整源码)

本文深入解析通达信波段交易副图指标的构建与应用,提供完整源码实现,帮助投资者精准捕捉买卖点。通过趋势强度度量、超买超卖判断及信号过滤机制,结合K线图分析,有效提升波段交易的成功率。

weixin_29306317的博客 611

输出前k大的数(分治算法)

给定一个数组,统计前k大的数并把前k大的数从小到大输出来。 输入: 10 4 5 6 9 8 7 1 2 3 0 5 输出: 9 8 7 6 5 程序代码: #include <iostream> using namespace std; int js(int,int); int a[100001]; int main(){ int n,k; cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; js(1,n); cin&gt

qq_43510083的博客 780

HarmonyOS ArkTS开发实战:用Axios封装一个通用的网络请求工具类(附完整代码)

本文详细介绍了如何在HarmonyOS ArkTS开发中利用Axios封装一个通用的网络请求工具类,涵盖架构设计、核心模块实现、UI状态联动及高级功能扩展。通过单例控制器、拦截器链配置和Token自动刷新机制,提升网络请求的稳定性和可维护性,适用于各类HarmonyOS应用开发场景。

weixin_30772105的博客 491

高级电机控制场景实例:基于Simulink的永磁同步电机基于Luenberger观测器的弱磁控制仿真

本文基于Simulink实现表贴式永磁同步电机(SPMSM)的Luenberger观测器弱磁控制仿真,通过构建“观测-弱磁-控制”协同逻辑,突破传统矢量控制的基速限制。利用线性化模型设计观测器实时估计电流与磁链,结合电压极限约束动态注入负d轴电流,实现转速扩展至12000rpm(4倍基速),弱磁区电流THD低于3%,动态响应时间小于5ms,验证了高速运行下系统稳定性与鲁棒性。附完整建模步骤、MATLAB函数代码及性能分析,适用于电动汽车、机床等高速驱动场景,为高级电机控制提供可复现的技术范式。

amy_mhd的博客 33

信息学奥赛一本通 1235:输出前k大的数 分治算法

正解是使用分治的思路来解决,我们可以使用快速排序的思路,利用一个中间值,将数组分成两部分,前半部分大于中间值,后一部分小于中间值;第二行包含n个整数,表示数组的元素,整数之间以一个空格分开。重点:对于不包含1-k的区间,可以忽略,这样就可以使时间复杂度降低到O(N)解析:排序后输出前k个数,时间复杂度为O(NlogN),太简单了,略;第一行包含一个整数n,表示数组的大小。给定一个数组,统计前k大的数并且把这k个数从大到小输出。从大到小输出前k大的数,每个数一行。第三行包含一个整数k,k < n。

长春高老师编程 1467

【DevOps】rancher集成ldap,实现统一账号登录

登录到rancher控制台,选择【安全】-【认证】 选择【OpenLDAP】 其中【搜索起点】需要去ldap界面查配置完成

CN_Eden 1096

【算法系列篇】分治-快排

分治-快排算法:颜⾊分类、排序数组、数组中的第k个最大元素、最小的k个数

不能再留遗憾了的博客 3126

【MATLAB代码】TDOA+TOA融合算法,高精度定位。通过多边定位解算4个锚点、平面目标的位置,附代码

二维平面下的TOA、TDOA及混合定位算法,通过4个锚节点对目标点进行定位。

985工科博士毕业,专攻定位、导航和滤波等算法研究。从业10年,主要使用MATLAB 212

【AUTOSAR-E2E】-2.1-配置E2E:基于E2EPW配置一个RX接收的Signal Group(使用E2E Profile 2)

《共13页精讲》:此法也适用于E2E Profile 4/5/6/7/11/22 目录 1 检查CAN Matrix Arxml/DBC是否满足E2E需求 2 在DaVinci Developer中为Port添加E2E保护 3 在DaVinci Configurator settings设置 4 如何使用应用层的E2E保护 5 结尾 <--返回「Autosar_BSW高阶配置」总目录--> <--返回「Autosar_BSW高阶配置」专栏主页--> <--

「汽车电子助手」的博客 4420

输出前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

qiaoyifan的博客 5445

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

输出前k大的数

010:输出前k大的数 总Time Limit: 10000ms 单个测试点时间限制: 1000ms Memory Limit: 65536kB Description 给定一个数组,统计前k大的数并且把这k个数从大到小输出。 Input 第一行包含一个整数n,表示数组的大小。n < 100000。 第二行包含n个整数,表示数组的元素,整数之间以一个空格分开。每个整数的绝对值不超过10...

热爱阳光和自己 797

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

输出前m大的数(分治)--算法学习

描述 给定一个数组包含n个元素,统计前m大的数并且把这m个数从大到小输出。 输入 第一行包含一个整数n,表示数组的大小。n < 100000。 第二行包含n个整数,表示数组的元素,整数之间以一个空格分开。每个整数的绝对值不超过100000000。 第三行包含一个整数m。m < n。 输出 从大到小输出前m大的数,每个数一行 排序后再输出,复杂度 O(nlogn) 用分治处理...

weixin_45822638的博客 2894

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

分治——输出前m大的数

问题描述 给定一个数组包含n个元素,统计前m大的数并且把这m个数从大到小输出。 输入 第一行包含一个整数n,表示数组的大小,n < 100000. 第二行包含n个整数,表示数组的元素,整数之间以一个空格分开。每个整数的绝对值不超过1000000000. 第三行包含一个整数m。m < n 输出 从大到小输出前m大的数,每个数一行。 问题分析 1、排序后再输出,复杂度O(...

Dainelcw 1246

一本通1235:输出前k大的数

【题目描述】 给定一个数组,统计前k大的数并且把这k个数从大到小输出。 【输入】 第一行包含一个整数n,表示数组的大小。n < 100000。 第二行包含n个整数,表示数组的元素,整数之间以一个空格分开。每个整数的绝对值不超过100000000。 第三行包含一个整数k,k < n。 【输出】 从大到小输出前k大的数,每个数一行。 【输入样例】 10 4 5 6 9 8 7 1 2 3 ...

zdidi的博客 1210
上一篇: 算法篇之分治算法--快速排序
下一篇: 数据库系统概论--第一章绪论
mind_programmonkey
mind_programmonkey 领域专家: 算法与数据结构技术领域 领域专家: 算法与数据结构技术领域
博客等级 码龄9年 4435粉丝 1111原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mind_programmonkey

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值