第k个数(快速选择算法)

C++题解 第K个数 题目描述 给定一个长度为 n 的整数数列,以及一个整数 k,请用快速选择算法求出数列从小到大排序后的第 k 个数。 输入格式 第一行包含两个整数 n 和 k。 第二行包含 n 个整数(所有整数均在 1∼109 范围内),表示整数数列。 输出格式 输出一个整数,表示数列的第 k 小数。 数据范围 1≤n≤100000, 1≤k≤n 输入样例: 5 3 2 4 1 5 3 输出样例: 3 思考 对于最快的排序算法,我们仍然需要O(nlogn)的时间进行完全排序,如果题目时间限制较紧,先排序后输出或许会导 阅读详情

第k个数(快速选择算法)

在快速排序的基础上增加了输出第k个数的要求,显然易知可以通过快排后直接输出数组下标来实现,但快速排序算法的时间复杂度为O(nlogn),而快速选择算法的时间复杂度是O(n),大家可以根据数据范围的不同选择不同的方法。

快速选择算法
与快速排序相同的是,仍然先找到整个数组的一个分界点x,可以是左边,右边,中间等,使x左边的数都小于等于x,右边的数都大于等于x,进而再递归排序左右两边,之后设x左边的数的个数为Sl,右边为Sr。
由于我们要求第k个数,如果k是小于等于Sl的话,证明k是在我们的x的左边,则我们只需要递归左边就可以了,反之递归右边(第k个数变为第k-Sl个数)。
时间复杂度O(n(1+1/2+1/4+1/8+…)<=2n) 故为O(n)的时间复杂度。

例题
给定一个长度为 n 的整数数列,以及一个整数 k,请用快速选择算法求出数列从小到大排序后的第 k 个数。

输入格式
第一行包含两个整数 n 和 k。

第二行包含 n 个整数(所有整数均在 1∼1e9 范围内),表示整数数列。

输出格式
输出一个整数,表示数列的第 k 小数。

数据范围
1≤n≤100000,
1≤k≤n
输入样例:
5 3
2 4 1 5 3
输出样例:
3

代码

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 1e5+10;
int n,k;
int q[N];

int quick_sort(int l,int r,int k)
{
    if(l==r) return q[l];
    
    int x=q[(l+r)>>1],i=l-1,j=r+1;
    
    while(i<j){
        do i++; while(q[i]<x);
        do j--; while(q[j]>x);
        if(i<j) swap(q[i],q[j]);
    }
    int sl=j-l+1;
    if(k<=sl) return quick_sort(l,j,k);
    else return quick_sort(j+1,r,k-sl); //变为k-sl
}

int main()
{
    cin>>n>>k;
    for(int i=0;i<n;i++)
    {
        cin>>q[i];
    }
    
    cout<<quick_sort(0,n-1,k)<<endl;
}
全排列剖析:求n个数第k个排序----康托展开 康托展开的公式:(不用记,看形势就行,下面会有例子) X=an*(n-1)!+an-1*(n-2)!+...+ai*(i-1)!+...+a2*1!+a1*0! ai为整数,并且0 适用范围:没有重复元素的全排列 第一类题:N个数的第k个排序,例子,1,2,3,4共有4!种排列,1234,1243,1324等等。按顺序应该是 1234 1243 1324 1342 1 阅读详情

相关推荐

避坑指南:STM32定时器测PWM频率占空比时,那些CubeMX没告诉你的细节(蓝桥杯真题衍生)

本文深入解析STM32定时器测量PWM频率和占空比时的关键细节,揭示CubeMX配置中未明确的时钟树原理和输入捕获机制。针对蓝桥杯嵌入式赛题中的常见问题,提供动态调整预分频器、多采样数字滤波等实战解决方案,帮助开发者避免测量误差,提升PWM测量精度和稳定性。

weixin_28692153的博客 339

786. 第k个数 【快速排序】

题目 给定一个长度为 n 的整数数列,以及一个整数 k,请用快速选择算法求出数列从小到大排序后的第 k 个数。 输入格式 第一行包含两个整数 n 和 k。 第二行包含 n 个整数(所有整数均在 1∼109 范围内),表示整数数列。 输出格式 输出一个整数,表示数列的第 k 小数。 数据范围 1≤n≤100000, 1≤k≤n 输入样例: 5 3 2 4 1 5 3 输出样例: 3 题解 快速选择 #include <iostream> using namespace std; const int

午夜的行人 791

基于Pixi.js的Live2D看板娘离线加载实战指南

本文详细介绍了基于Pixi.js实现Live2D看板娘离线加载的完整方案,涵盖环境搭建、模型加载、交互功能实现及常见问题解决。通过Pixi.js的硬件加速优势,开发者可在Web和Electron项目中无缝集成离线运行的Live2D模型,提升用户体验并避免网络依赖问题。

weixin_29001423的博客 343

第k个数

第k个数

m0_70008390的博客 263

薄膜电容寿命预测全解析:从理论到实践,5步搞定可靠性评估

本文全面解析薄膜电容寿命预测的理论与实践,提供五步可靠性评估流程,涵盖温度应力、电压应力等关键因素分析,并分享提升寿命的实用技巧。特别适用于新能源、电动汽车等领域的设计工程师,帮助准确预测薄膜电容在实际工况下的使用寿命。

weixin_33712987的博客 433

混合开关电容DCDC变换器技术解析与工程应用指南

在电源设计领域,传统DCDC变换器在高降压比或高升压比场景下,往往面临占空比过窄、开关应力大、效率偏低等瓶颈。开关电容变换器虽能实现固定比例的电压变换,却受限于调节能力。混合开关电容DCDC变换器通过“开关电容网络粗调变比+电感式DCDC细调输出”的策略,兼顾高效率、高功率密度与宽调压范围。本文梳理了其典型拓扑(如2:1/4:1 SC+Buck)、关键对比、控制策略(含软充电)及工程应用中的常见问题,帮助电源工程师在服务器供电、快充、车载电源等场景下快速选型与调试。

weixin_29164185的博客 314

【快速排序】快速排序/第k个数

acwing算法学习笔记 -----快速排序

青竹雾色间.的博客 1998

Windows10完美驱动Apple Studio Display全攻略:从雷电转接到亮度调节(附N卡兼容列表)

本文详细介绍了在Windows10系统下如何完美驱动Apple Studio Display显示器,包括雷电接口转接方案、BootCamp驱动安装及NVIDIA显卡兼容性测试。特别推荐GTX 1660 Super等显卡,提供5K@60Hz稳定输出,并分享色彩管理及日常使用技巧,帮助用户充分发挥这款苹果显示器的性能。

weixin_29284657的博客 1091

算法_第k个数(快速选择)

如何选择递归并返回哪一部分?在快速排序内设置sl记录l~j部分的长度,如果sl >= k则第k个数落在前一部分,否则k落在后一部分。3.根据第k个数所在位置,选择用快速排序递归l~j部分还是j+1~r部分并返回递归的值(递归返回到第1步执行)1.如果l == r则第返回q[l](递归到最后只剩一个数就是第k个数)3.快速排序内的递归两个部分变为根据k的位置递归并返回其中一部分。2.结束递归条件为最后返回l == r。1.相比快速排序增加了k参数。2.快速排序数组q的l到r。

BREKOJI的博客 376

multisim14.3无法访问数据库...如何解决?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 4469

红队攻防渗透技术实战流程:云安全之云原生安全:特权模式和挂载模式

红队云攻防实战1. 什么是云 1. 什么是云

HACKONE的博客 573

算法:分治思想处理快排递归以及快速选择/最小K个数问题

分治思想解决快速排序,并引申出快速选择

海绵宝宝de派小星的博客 6008

YOLOv8与注意力机制融合:EMA(高效多维注意力)的原理剖析与实战应用

本文介绍了如何在YOLOv8目标检测模型中集成EMA(高效多尺度注意力)机制。主要内容包括:EMA注意力机制的工作原理解析,展示其多尺度特征融合和高效计算特性;详细的环境配置与依赖安装指南;EMA模块的完整代码实现,包含分组处理、空间注意力权重计算和特征融合等关键步骤;以及将EMA集成到YOLOv8网络结构的方法。通过添加EMA模块,可以提升模型对关键特征的关注能力,有效抑制背景干扰,从而增强目标检测性能。本教程提供了从原理到实现的完整解决方案。

m0_64661770的博客 147

第k个数_(快速选择算法)

给定一个长度为n的整数数列,以及一个整数k,请用快速选择算法求出数列的第k小的数是多少。 输入格式 第一行包含两个整数 n 和 k。第二行包含 n 个整数(所有整数均在1~109范围内),表示整数数列。 输出格式 输出一个整数,表示数列的第k小数。 数据范围 1≤n≤100000,1≤k≤n 输入样例: 5 3 2 4 1 5 3 输出样例: 3 #include<iostream> ...

weixin_44828107的博客 1328

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

第K个数:快速选择算法

在快排的基础上,比较k与一次排序后左区间的个数,确定q[k-1]即第K个数所在的区间,然后只递归该区间即可。若在右区间,则是第k - L 个数(L是左区间个数 #include<iostream> using namespace std; const int N = 100010; int q[N]; int quick_check(int l, int r, int k) { if (l >= r) return q[r];// 不能返回q[k] int i = l

qq_62024537的博客 708

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

【刷题】基础算法——快速选择:第k个数

题目链接 延续快排的思路,选一个数将区间分成两部分: |-------小于x的数-------|--------大于x的数--------| 左边子区间个数为SL,右边子区间个数为SR。 当k <= SL时,递归左区间 当k > SL时,递归右区间 当用j划分区间时,左区间是[l,j][l, j][l,j],右区间是[j+1,r][j + 1, r][j+1,r] 因此SL=j−l+1S_L=j - l + 1SL​=j−l+1 时间复杂度分析: 由于每次只在两个子区间中选一个,因此是 n+n/

qq_42581685的博客 558

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

786 第k个数(快速选择算法)

1. 问题描述: 给定一个长度为n的整数数列,以及一个整数k,请用快速选择算法求出数列从小到大排序后的第k个数。 输入格式 第一行包含两个整数 n 和 k。 第二行包含 n 个整数(所有整数均在 1∼10 ^ 9 范围内),表示整数数列。 输出格式 输出一个整数,表示数列的第 k 小数。 数据范围 1≤n≤100000, 1≤k≤n 输入样例: 5 3 2 4 1 5 3 输出样例: 3 来源:https://www.acwing.com/problem/content/descr...

二哈 804

基础算法:基于快速排序的快速选择——第k个数

【代码】基础算法:基于快速排序的快速选择——第k个数。

lichengyang的博客 270

快速选择算法求第k个数

快速选择算法求第k个数 快速选择算法的思想和快速排序十分接近,快速排序是在一组数中找一个数为基准,然后小于该数的放在数组右边,大于该数的放在数组左边,然后以该数为分界,左右递归求解,快速选择前面的思路和快排一样,只不过因为我们要求第k个数,不管是第k大还是第k小,假设求第k小的数,那么如果左半段的个数大于k,这第k小的数一定在左半段,只需对左半段递归即可,如果左半段的个数小于k,那么就在右半段,但是这时候要注意的一点就是整体的第k小,在右半段就是第k-sl小(假设sl是左半段的长度),那么这时只需对右半段递

m0_56015524的博客 130

LeetCode刷题实况(一)快速选择算法-------最小的K个数/最小的第K个数(剑指offer40题)

题目链接:查找最小的K个数 本题,一般人的第一思路是用排序,然后取前k个,那么这个时间复杂度,就取决于排序算法的时间复杂度。最小的O(nlogn)。 虽然这个很好想,但在面试时只能做最初的方案(面试时很推荐最开始用这个算法,后面再改进,可以让面试官看到你思考的过程)。如果就是排序,没有后续的优化,那这道题答的就太失败了 接下来咱们就介绍两种优化的方式,具体用哪一个,看面试官怎么说 第一种:快速选择...

qq_42860166的博客 601

第 k 个数(快速选择算法)

文章目录一、题目二、思路及代码1.思路第一步:第二步:第三步:2.答案总结Just Review. 提示:以下是本篇文章正文内容 一、题目 给定一个长度为 n的整数数列,以及一个整数 k, 请用快速选择算法求出数列从小到大排序的第 k个数。 输入格式 第一行包含两个整数 n和 k。 第二行包含 n个整数(所有整数均在 1∼109 范围内),表示整数数列。 输出格式 输出一个整数,表示数列的第 k小数。 数据范围 1≤n≤100000, 1≤k≤n 输入样例: 5 3 2 4 1 5 3 输出样

bitkingtrue的博客 277

python 第k个数 快速选择算法【简单易懂,代码直接运行】

python 第k个数 快速选择算法 给定一个长度为 n 的整数数列,以及一个整数 k,请用快速选择算法求出数列从小到大排序后的第 k 个数。 输入格式 第一行包含两个整数 n 和 k。 第二行包含 n 个整数(所有整数均在 1∼109 范围内),表示整数数列。 输出格式 输出一个整数,表示数列的第 k 小数。 数据范围 1≤n≤100000, 1≤k≤n 输入样例: 5 3 2 4 1 5 3 输出样例: 3 快速选择算法,是在快排的基础上进行元素选择,快速排序实质是一个双指针算法,它分为左指针l和右指针

于笨笨的博客 1920

[排序] 第k个数(模板+快速选择算法)

文章目录0. 前言1. 快速排序 0. 前言 快速选择算法的思想还是很厉害的。是快速排序的应用,一般将一次快排称为做了一次 partition 操作。c++ stl 也将该函数纳入其中,感兴趣可取查看相关 API。 1. 快速排序 786. 第k个数 本质: 快排应用 时间复杂度:O(n)O(n)O(n) 空间复杂度:O(logn)O(logn)O(logn),基于递归,用到栈空间 思路: 一次快排,数轴左边都 <=x,数轴右边都 >= x 左边的元素个数为 s = j - l + 1 如果

Y-puyu 的博客 333

第k个数(快速选择算法)python3

p1_2第k个数(快速选择算法) 题目:https://www.acwing.com/problem/content/788/ #时间复杂度2n,即O(n),比快速排序法快,所以不直接先快速排序再输出第k个数 def main(): n,k=map(int,input("n&k\n").split()) nums=list(map(int, input("nums\n").split())) quick_selet(nums, 0, n-1, k)#下标是从0开始的 扩充

zheshui69163的博客 490

【分治法】第k个数(快速选择算法,结合快速排序)

给定一个长度为 n 的整数数列,以及一个整数 k,请用快速选择算法求出数列从小到大排序后的第 k 个数。 输入格式 第一行包含两个整数 n 和 k。 第二行包含 n 个整数(所有整数均在 1∼109 范围内),表示整数数列。 输出格式 输出一个整数,表示数列的第 k 小数。 数据范围 1≤n≤100000, 1≤k≤n 输入样例: 5 3 2 4 1 5 3 输出样例: 3

怪&的个人博客 970

分治思想--快速选择算法解决最小的k个数(TopK问题)

最简单粗暴的做法就是直接使用快速排序来解决这个问题,先对原数组进行排序,再 返回倒数第k个的位置,快速排序的时间复杂度为O(nlogn),但其实可以通过对其过程中进 行优化,是的算法的速度更快。到达边界条件后递归,此时l = 4,j = 4,此时寻找目标在左部分子数组, 所以对左部分子数组进行递归,又l = r,所以递归结束,输出结果。如果每次规模为n的问题都划分成1和n - 1,每次集合又向n -1。

qq_33899031的博客 1354
上一篇: 【快速排序】
下一篇: 【归并排序】
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值