线性时间复杂度求数组第n大

找第N大的数(线性算法) 分治 阅读详情

算法理论基础见《算法导论》的第9章

#include <iostream>
#include <time.h>
using namespace std;

#define NSIZ 1000

int partision(int arr[], int left, int right)
{
	int tmp = arr[left];


	while(left < right)
	{
		while(left < right && tmp <= arr[right]) --right;
		arr[left] = arr[right];


		while(left < right && arr[left] <= tmp) ++left;
		arr[right] = arr[left];
	}


	arr[left] = tmp;
	return left;


}

int random(int m, int n)
{
	if(m == n)
	{
		return m;
	}


	srand(time(0));


	return m + ((n - m) * rand()) / RAND_MAX;


}

int RandomPartision(int arr[], int left, int right)
{
	int t = random(left, right);
	int tmp = arr[t];
	arr[t] = arr[left];
	arr[left] = tmp;


	return partision(arr, left, right);
}

int qsort(int arr[], int left, int right, int n)
{
	if (left == right)
	{
		return arr[left];
	}


	int i = RandomPartision(arr, left, right);


	int k = i - left + 1;


	if (k == n)
	{
		return arr[i];
	}
	else if (k > n)
	{
		return qsort(arr, left, i-1, n);
	}
	else
	{
		return qsort(arr, i+1, right, n-k);
	}


}


int main()
{
	int arr[] = {1, 1, 5, 3, 2, 2, 3, 10, 19};
	int arrLen = sizeof(arr)/sizeof(arr[0]);
	int res = qsort(arr, 0, arrLen - 1, 4);
	printf("%d ", res);
	return 0;
}


C++求前N个素数——线性筛法 C++求前N个素数——线性筛法 素数 又称质数,是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。 判断素数 一般而言,判断一个数n是不是素数,只需要用n分别除以[2,n-1]看是不是能整除,这样的话时间复杂度为O(n^2)。 但是实际上我们其实只需要用n分别除以[2,floor(sqrt(n-1))]就可以判断出n是否是素数了,但是为什么呢,我也不知道,反正大家都这么干 这样下来的时间开销是√1+√2+√3+…+√n,这个式子目前好像还没有公式可以表示。 //判断一个数是否是素数 bo 阅读详情

相关推荐

【算法拾遗】三种方法求连续子数组的最大和

这是一道考的烂的不能再烂的题目,但是依然有很多公司乐于将这样的题目作为笔试或面试题,足见其经典。 问题是这样的:一个整数数组中的元素有正有负,在该数组中找出一个连续子数组,要求该子数组中各元素的和最大,这个子数组便被称作最大子数组。比如数组{2,4,-7,5,2,-1,2,-4,3}的最大子数组为{5,2,-1,2},最大子数组的和为5+2-1+2=8。 下面按照时间复杂度逐步优化的顺序依次给出这三种算法。

兰亭风雨的专栏 3万+

寻找数组中第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万+

线性筛进阶(三): 求N的因子个数

线性筛 算法思路 利用线性筛判断如果N是素数,那么其因子的个数为2. 一个非素数N可以写成素因子幂次连乘的形式. 列如 12 的因子个数为 6 个, 可以用素因数的(幂次+1)乘素因数的(幂次+1) : 对素因数的不同取法都是12的因子. 首先先完成线性筛函数,然后改写 #define MAX_N 1000 int prime[MAX_N + 5] = {0}; void init() { for (int i = 2; i <= MAX_N; i++) {

OnlyFeiger的博客 1678

快速排序的衍生问题之求数组中第n大元素

快速排序求数组中第n大元素 还不了解快速排序的柚子,请参考我的这篇博客 聊聊时间复杂度为O(nlogn)的快速排序(下) //快速排序求数组中第n大的元素 // 寻找arr数组中第k小的元素, k从1开始索引, 即最小元素是第1小元素, 以此类推 template<typename T> T findN(T arr[], int n, int key) { return __findN(ar

qq_41033011的博客 334

删除无序数组中跳跃重复值并排序(时间复杂度为O(n))

问题描述:现you

3222

蠕虫病毒代码(纯属参考,请勿用于非法事件)

1.介绍蠕虫病毒 蠕虫病毒是一种常见的计算机病毒,是无须计算机使用者干预即可运行的独立程序,它通过不停的获得网络中存在漏洞的计算机上的部分或全部控制权来进行传播。 计算机病毒是指编制或者在计算机程序中插入的破坏计算机功能或者破坏数据和恶意篡改系统. 影响计算机使用并且能够自我复制的一组计算机指令或者程序代码 中文名:蠕虫病毒 传染方式:网络和电子邮件 外文名:Worm virus 类型:计算机病毒 2.代码(建议使用虚拟机,否则你的计算机将会就地报废,使用时要关闭电脑病毒保护,否则程序会...

Kenny20211105的博客 2万+

数组-----找出数组中第二大的数(时间复杂度O(n))

定义一个变量存储最大的数,一个变量存储第二大的数,遍历数组,找出第二大的数

weixin_39916039的博客 2955

告别环境配置噩梦:VSCode + MinGW 下 OpenGL (glad/glm/glfw) 一站式配置指南(含常见错误排查)

本文提供了一份详细的VSCode与MinGW下OpenGL开发环境配置指南,涵盖glad、glm和glfw三大核心库的安装与调试。通过逐步指导解决常见错误,帮助开发者快速搭建高效的OpenGL开发环境,特别适合初学者避免环境配置中的常见陷阱。

weixin_42557803的博客 490

求最大子数组问题并附上如何求出其时间复杂度

因此其时间复杂度为T(n) = O(1) + O(1) + O(n) + O(nlgn + n) = nlgn + O(n) + O(n) +O(1) + O(1)第一种思想:采用非递归的、线性时间的算法。当n足够大时, O(n) + O(n) +O(1) + O(1)这部分可以忽略不计,则T(n) = O(nlgn)第二种思想:采用分治策略,将问题简单化,之后将出来的解再进行合并。当 n = 1,也就花费的代价就是执行这一部分代码,则T(1) = O(1)

m0_64655190的博客 294

首发!谷歌倾斜摄影数据转换生成OSGB格式

全球首发,谷歌倾斜摄影模型文件能直接转换成OSGB格式!

cyber_room的博客 2287

从原理到实现:在《图灵完备》中构建一个144*256像素、1536时钟刻/帧的视频播放器

本文详细解析了在《图灵完备》游戏中构建144*256像素、1536时钟刻/帧视频播放器的全过程。从图灵完备原理出发,通过分层架构设计、视频数据预处理和关键电路实现,展示了如何用基础电子元件模拟现代显卡功能。重点介绍了像素坐标定位系统和颜色数据处理流水线的优化方案,为游戏内复杂电子系统设计提供实践指导。

weixin_42520025的博客 445

线性筛求范围内质数

线性筛也叫欧拉筛,求范围内质数的时间复杂度仅为o(n),在数据很大时非常好用。

yaozizhi_yang的博客 296

Applied Intelligence投稿经验分享(正在投稿中)

这几天在投稿Applied Intelligence这个期刊,过程很曲折,反反复复,因此写一篇经验分享,希望能记录一下自己的过程,也能给其他人一些帮助(可以在评论区讨论),提醒一下,一定要写一些声明,不会写、不知道写啥就看第四章的第二个问题。

weixin_55988068的博客 1万+

414. 第三大的数

题目描述: 给定一个非空数组,返回此数组中第三大的数。如果不存在,则返回数组中最大的数。要求算法时间复杂度必须是O(n)。 示例 1: 输入: [3, 2, 1] 输出: 1 解释: 第三大的数是 1. 示例 2: 输入: [1, 2] 输出: 2 解释: 第三大的数不存在, 所以返回最大的数 2 . 示例 3: 输入: [2, 2, 3, 1] 输出: 1 ...

wchzh2015的博客 217

50、压电微泵与技术设备驱动的研究分析

本文研究了压电微泵在弹性微通道中的流体流动特性及技术设备驱动的振动行为。通过建立轴对称流固耦合模型,利用FreeFem++进行数值模拟,分析了不同数量压电致动器和频率对微泵流量的影响,发现多个致动器按特定时序压缩可产生净正向流量,并提出了稳态流量的近似解析公式。同时,针对技术设备驱动系统,探讨了周期性负载引起的强迫振动特性,明确了共振条件及影响因素,并比较了主动、被动和优化设计等振动控制策略。最后展望了实验验证、多物理场耦合与智能控制等未来研究方向,为相关设备的优化设计与高效运行提供了理论支持。

convnet3designer的博客 148

YOLOv8/v9 遥感图像目标检测实战指南:建筑物检测与变化监测

遥感图像在城市规划、灾害评估、农业监管等领域应用广泛,但传统目标检测方法存在效率低、精度不足、难以适配遥感图像大尺寸、多尺度目标等问题。本文以“建筑物检测与变化监测”为核心,基于DOTA、NWPU VHR-10等公开数据集,系统讲解YOLOv8/v9在遥感图像中的实战流程。从数据获取、格式转换、模型训练优化,到大图切片推理、建筑物变化监测,全程提供可复现的代码与参数配置。通过针对性优化(旋转增强、切片推理等),模型在NWPU VHR-10数据集上mAP50达0.85以上,可适配卫星影像、无人机航拍等多场景

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 520

LeetCode HOT 100 —— 215.数组中的第K个最大元素

刷题总结

qq_39473176的博客 667

运维简历优化指南,DeepSeek助您运维简历秒变高分!

例如,当掌握了新的运维技术,如 Serverless 架构的运维管理,就将其添加到简历的专业技能部分,并简要描述在相关项目中的应用情况和成果,如 “在 [项目名称] 中,负责 Serverless 架构的运维工作,成功实现了应用的低成本、高弹性运行,降低了运维成本 30%”。上传简历至 DeepSeek,并输入指令:“请根据以下岗位招聘要求,帮我重新解构我的简历,按照【教育背景→实习经历→项目经历→个人评价→技能证书】的模块,输出一份符合下述岗位的简历,提升我的求职竞争力。

大模型大数据攻城狮的专栏 1467

K:找寻数组中第n大的数组元素的三个算法

相关介绍:  给定一个数组,找出该数组中第n大的元素的值。其中,1<=n<=length。例如,给定一个数组A={2,3,6,5,7,9,8,1,4},当n=1时,返回9。解决该问题的算法有三种。依据其时间复杂度的高低,分别对其进行讲解 第一种:时间复杂度为O(NlogN)  解决该问题,容易想到的一个办法是,先对数组按元素值从大到小的方式进行排序,之后选取出其符合要求的元素...

diaosangwan0363的博客 745

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【算法】线性时间选择——第k大(小)元素问题

文章目录前言分治算法之第k小元素分治算法之第k大元素 前言 问题:给定线性序列中 n 个元素和一个整数 k ,1 ≤ k ≤ n,要求找出元素中的第 k 小的元素 或者 第 k 大元素,要求是线性时间算法,即时间复杂度为O( n )。 需要用到快速排序的分区思想,有关分治法思想和快速排序文章:【算法】分治算法 分治算法之第k小元素 问题:给定线性序列中 n 个元素和一个整数 k ,1 ≤ k ≤ n,要求找出元素中的第 k 小的元素 ,要求是线性时间算法,即时间复杂度为O( n )。 设计思想:

高朗的博客 7481

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

程序基本算法习题解析 线性时间选择:给定线性集中有n个元素,要求找出这n个元素中第k小的元素。 给定的线性集是无序的,要求在线性时间内完成。

题目: 在给定线性集中有n个元素,要求找出这n个元素中第k(1&lt;=k&lt;=n)小的元素。给定的线性集是无序的。要求在线性时间内完成,线性时间的要求是指在最坏情况下也要保证在O(n)时间内完成选择。输入3行,第一行为数据元素个数,第二行为需要确定的第k小的元素,第三行输入数据元素,用空格隔开。输出一行,输出第k小的元素。 思路: 若是没有要求在O(N)时间内完成选择,那么最简单的做法...

elma_tww的博客 7057

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

时间复杂度O(n)什么意思

时间复杂度 算法分析 同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法乃至程序的效率。算法分析的目的在于选择合适算法和改进算法。一个算法的评价主要从时间复杂度和空间复杂度来考虑。 一、时间复杂度 (1)时间频度 一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道。但我们不可能也没有必要对每个算法都上机测试,只需知道哪个算法花费的时间多,哪个算法花费的时间少就可以了...

wlddn的博客 2万+

数据结构排序系列指南:从O(n²)到O(n),计数排序如何实现线性时间复杂度

在排序算法的世界中,计数排序以其独特的"非比较"特性脱颖而出。作为一种基于"统计与映射"思想的排序方法,计数排序彻底颠覆了传统比较排序的思维模式,通过巧妙利用数据本身的数值特征来实现排序,在特定场景下能够达到惊人的线性时间复杂度O(n)。 本文将从计数排序的核心理念切入,深入剖析其"以数为据"的本质,详细讲解从基础统计到映射定位的完整实现过程,对比不同场景下的空间优化策略,并通过实战代码展示其在实际应用中的价值,帮助你彻底掌握这种高效而独特的排序算法。

晨非辰的学习记录博客~~ 1431

时间复杂度o(N)是什么意思?

O(N)表示算法的运行时间随输入规模N的增大而线性增长。通常用于描述需要逐个访问、处理每个元素的算法(如遍历数组、链表等)。这种时间复杂度的算法在大规模数据时运行较慢,但比O(N^2)或更高的复杂度算法更具可扩展性。

小诸葛的博客 1371

分治算法求n个元素序列中第k个大的元素

     首先,我们应该设定产生随机数的序列存储在数组中,然后我们应该最容易想到的是排序对吧,做一个降序排序,就很容易找到第k个大的元素。但是用排序算法的话,时间复杂度最快的也是快速排序O(logn),如果我们使用分治算法求得话,会得到一个线性的时间复杂度O(n)。分治算法是将一个问题分成若干个子问题去实现。分治算法是离不开递归算法的。 怎么实现? 我们可以在数组中产生一个随机的下标,让他作为...

ly's Blog 1万+
上一篇: 前序和中序重建二叉树, 树的前序递归,中序递归,后序递归遍历和前序非递归,中序非递归,后序非递归遍历
下一篇: 判断二叉树是否包含另一棵二叉树或者树的子结构
nothing is worse
博客等级 码龄17年 5粉丝 101原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值