从n个数中选出第k大的数——简单随机选择

BFPTR算法(中位数的中位数算法)求n个数中第k大的数 BFPTR算法求n个数中第k大(即第n-1-k小)的数,其思想是基于快速排序中对Partion的pivot值进行优化,快速排序中每一趟快排的pivot的选取一般是数组的首项或者尾项(数值比较随机),而BFPTR是每次选择5分中位数的中位数作为pivot进行下一趟快速排序的,这样做可以使算法的时间复杂度由最坏的O(n^2)变为O(n). 实现代码如下: #include using names 阅读详情
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <queue>
#include <stack>
#include <set>
#include <iomanip>
using namespace std;
int a[1000005];
int t=0;
long long int quicksort(long long int left,long long int right,int a[])
{
    int x=a[left];
    long long int l=left,r=right;
    while(l<r)
    {
        while(l<r&&x<a[r])r--;
        a[l]=a[r];
        while(l<r&&x>a[l])l++;
        a[r]=a[l];
    }
    a[l]=x;
    return l;
}
long long int solve(long long int l,long long int r,int a[],long long int k)
{
    if(l==r)
        return l;
    long long int pos=quicksort(l,r,a);
    long long int m=pos-l+1;
    if(m==k)
    {
        return pos;
    }
    if(m<k)
        return solve(pos+1,r,a,k-m);
    else
        return solve(l,pos-1,a,k);
}
int main()
{
    long long int n;
    long long int k;
    cin>>n>>k;
    for(long long int i=0; i<n; i++)
    {
        cin>>a[i];
    }
    long long int ans=solve(0,n-1,a,k);
    cout<<a[ans]<<endl;
    return 0;
}

 

选择问题(一组N个数确定其中的第K个最大者) 1、该问题的一种解法是讲这N个数读进一个数组中,在通过某种简单排序算法(如:冒泡排序),以递减的 顺序将数组排序,然后返回位置k上的元素。(c语言编写,输入输出c++,纯c的话改过来即可) #include #include #define SIZE 10 using namespace std; int *BubbleSort(const int A[], int N 阅读详情

相关推荐

蓄水池抽样算法 从n个数中随机取m个数(JAVA实现)

实际问题 从n个数据中随机取得m个数,n>m 算法大概思路 源数据的数组为a[] 大小为n “水池”即存放取出的数据的数组为b[] 大小为m 若要做到随机 则每个数据被选中的概率则为m/n 进行如下操作 ①对数组a[]进行遍历,设置j为遍历时当前元素下标,将a[]数组的前m个数据依次存入数组b[]中,此操作a[]数组中的前m个数被加入b[]数组的概率为100...

qq_41800087的博客 2431

在N个数中查找第K大的数字(Top K问题)

在N个乱序数字中查找第k大的数字,时间复杂度可以减小至 O(N*logN) O(N) O(1) O(2) 答案:B 所谓“第(前)k大数问题”指的是在长度为n(n>=k)的乱序数组中S找出从大到小顺序的第(前)k个数的问题。 注意:题中只需得到最大的K个数,而不需要对后面N-K个数排序 可能存在的条件限制: 要求 时间 和 空间消耗最小、海量数据、待排序的数据可能是...

Carey_Lu的博客 2万+

求N个数中第K大的数

基于快排的查找来得到N个数中第K大的数,时间复杂度为O(KlogN)

选择问题——N个数中选择第K个最大数

决定开始好好学习,重拾JAVA,从头开始学数据结构和算法~ 如有不合适或者错误的地方欢迎各位大佬指出~~~

zz384dian的博客 1156

高分六号GF-6 WFV数据处理全流程:从原始数据解压到经纬度投影转换

本文详细解析了高分六号GF-6 WFV遥感数据的完整处理流程。从原始数据解压与分块结构理解入手,指导如何安装ENVI国产卫星支持工具进行自动拼接,并重点阐述了利用RPC模型进行正射校正以消除几何畸变,以及将UTM投影转换为地理经纬度坐标的关键步骤。文章旨在帮助用户高效地将原始卫星数据转化为可直接用于农业监测、生态环境分析等领域的标准地理空间图像。

weixin_29047919的博客 196

第5.1节 构网控制:电压源特性与电压调节

摘要: 构网型变流器的核心物理本质是作为可控交流电压源,通过戴维南等效模型(受控电势源+低输出阻抗)自主建立并调节电压,增强电网电压刚度。其电压调节通过无功-电压闭环控制实现,内环为自动电压调节器(AVR),外环为无功-电压下垂特性,模拟同步发电机功能。关键技术包括自适应增益、虚拟阻抗补偿及动态限流策略,以应对弱电网稳定性、故障过流等问题。该设计满足《规范》对电压调节范围、动态无功支撑的要求,是高比例新能源电力系统电压稳定的关键解决方案。

技术工作者 1108

【编程】典型题目:寻找数组第K大数(四种方法对比)

【编程】典型题目:寻找数组第K大数(四种方法对比)

Danger的博客 1789

什么是以太网链路聚合

以太网链路聚合技术通过将多个物理端口捆绑成逻辑端口,可显著提升网络性能。该技术能增加总带宽(各链路带宽之和)、提高可靠性(故障秒级切换)并实现智能负载分担。主要分为手工模式和基于LACP协议的动态模式,后者能检测链路故障更可靠。配置时需确保接口参数一致、模式匹配,适用于核心交换、服务器接入等场景。华为设备通过创建Eth-Trunk接口、指定LACP模式并添加成员接口即可完成部署。这项成熟技术能以低成本解决带宽瓶颈和可靠性问题,是构建高速稳定网络的关键方案。

lai_2020的博客 674

面试题:从n个数中找出第K大的数

参考https://blog.youkuaiyun.com/orangefly0214/article/details/84997668的思路 从有n个元素的乱序数组中找出第k大的元素 方法1:基于冒泡排序和简单选择排序,时间复杂度o(n*k) 我们知道,在冒泡排序和简单选择排序中,最外层的循环每遍历一次,都可以把第i大(或第i小)的数排到数组的最前面,所以我们用这种方法,最外面经过k次遍历之后,就可以...

orangefly0214的博客 5万+

目标检测数据集 第069期-基于yolo标注格式的玻璃清洁状态检测数据集(含免费分享)

但这类技术的落地,离不开大量标注规范、场景丰富的数据集作为算法训练的支撑,玻璃清洁状态检测数据集的出现,正是为了满足这一市场与技术需求。在高校与科研机构的计算机视觉研究中,该数据集可作为基础研究素材,用于探索物体状态识别的算法优化方向,比如针对玻璃这类透明物体的检测算法改进,或是小样本场景下的状态识别研究。通过摄像头采集车窗、挡风玻璃的图像,算法自动检测玻璃清洁度,若识别到脏污影响视线,及时提醒运维人员清洁,避免因玻璃脏污引发的安全事故,提升交通出行的安全性。

深度学习算法工程师,专注于前沿算法研究与实战应用。在这里,我将分享深度学习领域的实战经验、优质数据集资源以及最新论文解读与精度分析,旨在与广大技术爱好者共同探索人工智能的奥秘,助力技术成长与创新。 128

从零开始,用Cadence Virtuoso手把手仿真一个1.5V LDO(附完整电路与仿真脚本)

本文详细介绍了如何使用Cadence Virtuoso从零开始仿真一个1.5V LDO,包括环境准备、电路导入、Testbench构建、核心仿真类型分析以及高级调试技巧。通过完整的电路与仿真脚本,帮助读者掌握LDO设计与仿真的关键技术,提升电路设计能力。

weixin_31309419的博客 445

「leetcode」216.组合总和【回溯算法】详解!

别看本篇选的是组合总和III,而不是组合总和,本题和上一篇回溯算法:求组合问题相比难度刚刚好!

代码随想录 938

2026国内Claude Code保姆级教程:安装、避坑、防串台全优化

安装 Claude Code CLI + 切换 npm 国内镜像优先配置固定关闭:自动联网、自动项目扫描VSCode 内置终端直接用,不装多余插件会话隔离+指令约束,彻底解决 Rust、小程序 跨语言串台。

lpfasd123的博客 2543

查找N个数中第K大的数

如题,这个问题好像见过很多次了。印象对它很深刻。只是一直没有自己想出好办法。 今天做题目,仔细想了,有下面几个思路: 1. 直接排序,然后再遍历,这是最自然的方法,当然也是最笨的,时间效果不好; 2.开辟一个K大小的空间,存储了后排序,然后把其他身下的一个个对比,这样也可以得到第k大的数,效果好一点,不够如果k=N那么就退化了,而且增加了内存开销; 3.后来想到,K的大小问题,于是有快速排

ljiangbig2的专栏 1572

我装了10个ClawHub技能,这些最好用!

ClawHub就是Clawdbot的"应用商店"。Clawdbot是手机ClawHub是App Store技能就是各种App装了技能,Clawdbot才能干更多事。这个技能解决了我的信息过载问题。为什么装我订阅了很多Newsletter。每天收到一堆长文章,根本看不完。怎么用“总结这篇文章的核心观点”“把这个Newsletter提炼成3个要点”“这篇技术博客有哪些可以实践的建议?安装命令真实体验现在我收到长文章,直接转发给Clawdbot。它会提炼出核心要点和行动清单。

Maynor的博客 6100

11、CUDA 内存优化:平铺矩阵乘法技术解析

本文深入解析了CUDA中的平铺矩阵乘法技术,重点介绍了如何利用共享内存和线程协作减少全局内存访问,提升计算效率。通过矩阵乘法实例,详细阐述了平铺算法的执行流程、内核代码实现及性能优化策略,包括平铺大小选择、线程同步机制和代码优化建议。文章还分析了该技术在深度学习、图像处理和科学计算等领域的应用价值,为CUDA程序的内存优化提供了系统性指导。

peace的博客 70

top-K问题和随机选择算法

之前聊过top-K问题,有朋友反馈说,如果内存能容纳下这N个元素,那么使用堆处理top-K问题,并不是最佳算法。确实如此,在本文中,我们来循序渐进地看下top-K问题的处理思路:1.快速排序算法;2.直接选择算法;3.堆选择算法;4.随机选择算法。

认知 行动 坚持 2818

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

选择问题——N个数中取第K个最大

一、简单排序             思路:将N个数从大到小排序,取第K个数          1.冒泡排序                void BubbleSort(int *arr, int arrLen) { int change = 0; for(int i = 0; i < arrLen-1; i++) { change = 0; for(int j = 0

spch2008的专栏 5236

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

从N个数总随机选出M个数

来自编程珠玑 问题:假设一组数0,1,2,3,.....N-1,随机选出M个不重复的数字 开始0 被选择的概率为  M/N 1被选择的概率为  M/N(如果0没有被选择的话)  或者 M-1/N(0被选择了) 当到i 的时候被选择的概率为 剩余的数用r表示,要选择出的数用s,则其概率为 s/r 开始的时候 r=N s=M if(rand()%r概率为s/r    当rand(

surpassgood123的专栏 1553

NTscan扫描工具

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

从n个数中选出k个数

从n个数中选出k个数 #include <iostream> #include <vector> #include <algorithm> using namespace std; vector<int> a; vector<int> b; void fun(int a) { cout << a << " "; ...

你听我说,在这个地方你这样做,才是对的。 2762

寻找数组中第K大的数,时间复杂度O(N)

给定一个数组A,要求找到数组A中第K大的数字。对于这个问题,解决方案有不少,此处我只给出三种: 方法1:   对数组A进行排序,然后遍历一遍就可以找到第K大的数字。该方法的时间复杂度为O(N*logN) 方法2:   利用简单选择排序法的思想,每次通过比较选出最大的数字来,比较上K次就能找出第K大的数字来。该方法的时间复杂度为O(N*K),最坏情况下为O(N^2)。 方法3:     这种方法是本文谈论的重点,可以利用快排的思想,首先快排每次执行都能确定一个元素的最终的位置,如果这个位置是n-k

salmonwilliam的博客 1万+

GDAL在C#里处理遥感影像,从读取TIFF到获取坐标的完整代码示例与避坑点

本文详细介绍了如何在C#中使用GDAL库处理GeoTIFF格式的遥感影像,包括环境配置、文件读取、元数据提取和坐标转换等关键操作。通过完整的代码示例和避坑指南,帮助开发者高效实现遥感影像处理,特别强调了内存管理、坐标系统处理和性能优化等关键技术点。

weixin_30580341的博客 519

找出N个元素的数组中最大的K个数

题目: 给出 N 个整数(N可能很大,以致无法装入内存),找出前 K 个最大的整数 【解法一】 如果 N 的数量不是很大,例如在几千个左右,则在这种情况下,那我们就先排序一下,这里快速排序或者推排序都是很好的解决方案,平均时间复杂度为 O(N * log2N)。然后取出前 K 个,O(K)。 总共时间复杂度 O(N * log2N)+ O(K) = O(N * log2N)。 当 K =

shuiziliu1025的博客 7348

从n个数中选择随机选择m个, m个数互不重复

/////////*从n个数中选择随机选择m个, m个数互不重复******************////////////////// int g_seed = 0;   void srand_quick(int seed) {     g_seed = seed; }   inline int rand_quick() {     return ( ((g_s

wangxugangzy05的专栏 3703

N个数中寻找前K个最大的数

child++;先赞后看,养成习惯!!!码字不易,大家的支持就是我坚持下去的动力。关注我哦!如有错误请您指正批评!

2301_79811170的博客 478

随机N个数,并返回第k小的数

在前一篇的基础上,随即返回N个数。 返回第k小数,须将N个数进行排序。 方法有两种 第一,将N个数排序,返回a[k-1]; 第二,将前k个数排序,剩下的数逐个与a[k-1]比较,如果小于a[k],则调到正确位置,如果大于则忽略。 我采用的是第一种方法,以后在后续文章里加入第二种方法以及可能更好的方法 #include&lt;iostream&gt; #include&lt;cstdl...

LY_In_Mind的博客 445
上一篇: 1040 有几个PAT (25 分)
下一篇: OpenMP在VS2017上测试无法实现多线程问题的解决
Yolo_Fs
博客等级 码龄9年 41粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值