第三章:查找与排序(下)----------- 3.9 最快效率求出乱序数组中第k小的数

wsl + vscode 离线配置 ERROR: Faild to download https://update.code.visualstudio.com 很多情况下是没有现成的VS Code Server程序的,需要手动下载。记住上面的Commit ID,可以通过下面的链接下载 vscode-server-linux-x64.tar.gz。然后将vscode-server-linux-x64.tar.gz上传在服务器上的$HOME/.vscode-server/bin文件夹中,解压。在wsl中下载不了 vscode 的核心。运行下面两行命令,建立空的$HOME/.vscode-server/bin文件夹。重新运行 wsl与vs的链接即可。 阅读详情

最快效率求出乱序数组中第k小的数:

第k个元素:以尽量高的效率,求出一个乱序数组中按数值顺序的第k个元素值。

//伪代码:

selectK(A,p,r,k){
	q=partition(A,p,r); //主元下标 
	qK=q-p+1; //主元是第几个元素(排好序后) 
	if(qK==k){
		return A[q];
	} 
	else if(qK>k){
		return selectK(A,p,q-1,k);
	}
	else{
		return selectK(A,q+1,r,k-qK);
	}
}

partition(A,p,r) 

代码:

#include<iostream>
using namespace std;

//三点中值法 
int partition(int A[],int p,int r){
	
	//优化: 在p、r、mid之间,选一个中间值作为主元
	int midIndex=p+((r-p)>>1); //中间下标
	int midValueIndex=-1; //中值的下标
	if(A[p]<=A[midIndex]&&A[p]>=A[r]){
		midValueIndex=p;
	} 
	else if(A[r]<=A[midIndex]&&A[r]>=A[p]){
		midValueIndex=r;
	} 
	 else{
	 	midValueIndex=midIndex;
	 }
	swap(A[p],A[midValueIndex]);
	int pivot=A[p];
	
	int left=p+1;//扫描指针 
	int right=r; //右侧指针 
 
	
	while(left<=right){
		//left不停往右走,直到遇到大于主元的元素
		while(A[left]<=pivot) left++;   //循环退出时,left一定是指向第一个大于主元的位置 
		while(A[right]>pivot) right--;   //循环退出时,right一定是指向最后一个小于等于主元的位置 
		if(left<right){
			swap(A[right],A[left]);	
		}			
	} 
	//while退出时,两者交错,且right指向的是最后一个小于等于主元的位置,也就是主元应该待的位置 
	swap(A[p],A[right]);
	
	return right;		//返回主元在交换完成后的下标
}

int selectK(int A[],int p,int r,int k){
	int q=partition(A,p,r); //主元下标 
	int qK=q-p+1; //主元是第几个元素(排好序后) 
	if(qK==k){
		return A[q];
	} 
	else if(qK>k){
		return selectK(A,p,q-1,k);
	}
	else{
		return selectK(A,q+1,r,k-qK);
	}
}


int main(){
	int arr[]={2,4,6,1,7,2,8,3,7,3,6};
		
	cout<<selectK(arr,0,10,5);
	
	return 0;
}

时间复杂度:

平均:O(n);最差:O(n²)。

 

结果:

Cadence IC618/Spectre231安装避坑指南:详解License配置、环境变量隔离与依赖检查 本文详细介绍了Cadence IC618/Spectre231的安装与配置避坑指南,包括许可证系统精妙控制、环境隔离模块化实践、依赖管理进阶技巧以及长期维护的黄金法则。通过实战案例和解决方案,帮助工程师构建稳定可靠的EDA工作环境,提升芯片设计效率。 阅读详情

相关推荐

如何使用Qt的PIMPL习惯用法(PIMPL Idiom

PIMPL是指“Pointer to IMPLementation”(指向实现的指针),意味着将实现细节隐藏起来,用户类无需关注这些实现细节。在Qt中常用PIMPL习惯用法来清晰地区分接口与实现,尽管Qt官方文档并未详细说明该机制。本文将演示如何在Qt中使用PIMPL习惯用法,并以一个简单的坐标输入对话框作为实例。

电脑管家 1035

3.6 最快效率求出乱序数组中第k小的数

Chapter3: 更好的查找与排序算法 6. 最快效率求出乱序数组中第k小的数 题目 以尽量高的效率求一个乱序数组中第k小的元素 算法 算法1 用快排先将数组排序,然后直接找第k个元素,时间复杂度为O(nlgn) 算法2 思路 用分区查找的思想,同样有点排序的感觉,毕竟分区就是将小于主元的元素放左边,大于主元的元素放右边。 与排序完再查找不同的是: 这个思路不用将所有元素排序完...

bloger博客 447

虚拟机ubuntu22.04.3中安装vitis2024.1注意事项

虚拟机ubuntu安装vitis2024.1

qq_52033578的博客 2497

最快效率求出乱序数组中第k小的数

题目:以尽量高的效率求出一个乱序数组中按数值顺序的第k 的元素值 思路:这里很容易想到直接排序然后顺序查找,可以使用效率较高的快排,但是它的时间复杂度是O(nlgn),我们这里可以用一种简便的方法,不一定需要排序,使用快速排序中双向分区的扫描方法,这里使用的是优化过后的三点中值法,具体思想一样,只是主元的取法不一样。然后扫描出主元下标,然后根据主元的值将数组划分成一半大,一半小。然后再根据主元下...

weixin_30244681的博客 409

汽车车牌识别系统实现(二)--车牌定位+代码实现

汽车车牌识别系统实现(二)-- 车牌定位 前言 本人大四计算机视觉处理方面菜鸟一枚,因个人兴趣和毕设的缘故,故而想学习计算机视觉方面的内容,有不正确的地方还等各位大神批评指正。 图像预处理 照相机获取到汽车车牌图像时,绝大多数情况下,图像里只存在一个车牌的情况是不太现实的,一幅图像里存在建筑物、树、其它汽车等等是很正常的;而且绝大多数都会存在噪声点,这种情况下就会对车牌定位和识别造成极大程度的干扰...

奋斗の博客 1万+

Quartus Prime器件库安装实战:从版本选择到权限避坑指南

本文详细介绍了Quartus Prime器件库的安装全流程,从版本选择、精准下载到权限设置和安装验证。重点解析了版本匹配的黄金法则、管理员权限的必要性以及安装路径的最佳实践,帮助用户避开常见陷阱,确保器件库安装一次成功。

weixin_33713707的博客 516

查找:从N个乱序数据中找出第K小的数

从N个乱序数据中找出第K小的数如何从N个乱序数据中,快速地找出第K小的数?如果K接近0或者接近N,用选择排序,排几个应该就可以找到了。如果K比较大呢?或者说,就是要找N个乱序数据中的中位数呢?思路和快速排序很像。非常像。Review:快速排序算法现假设数组A,有N个元素。要快速地找出第K小的元素。基本思想还是用递归去查找。当然,在查找的过程中,也是需要排序的。但只是粗略地排序。关键问题还是找中轴变...

qcyfred的博客 5875

Nerf 训练自有数据

colmap相机位姿转为LLFF格式数据

zfjBIT的专栏 2310

Java实现:在N个乱序的数组中找第K大的数

类似于快速排序,执行一次快速排序之后,每次只选择一部分继续执行快速排序,直到找到第K大个元素为止,这个元素在数组位置后面的元素即为所求。 时间复杂度:O(n) 利用快排的思想,从数组arr中随机找出一个元素X,把数组分成两部分arr_a和arr_b。 arr_a中的元素比x大,arr_b中的元素比x小。 这个时候分为两种情况: 1.arr_a中的元素小于K,则arr_b中第k-arr_a

hqtc0704的博客 9271

Codex、Claude Code、Opus、Trae、Cursor:一文讲懂 2026 AI 编程工具格局

2026年AI编程工具将形成三层体系:模型层(Opus/Codex)负责思考,执行层(Claude Code/Codex Agent)负责自动开发任务,工具层(Cursor/Trae)提供AI集成的开发环境。关键区别在于Agent路线强调AI主导自动化开发,而IDE路线保持人类主导。未来竞争力取决于能否将AI整合为生产力系统,掌握模型推理、Agent任务编排和AI IDE协同三大能力。核心转变是从"写代码"升级为"指挥AI写代码",高级玩家通过组合不同层级工具构建自动

m0_51738372的博客 2696

mongodb在游戏开发领域的优势

目前游戏服务器使用mysql作为数据库的较多,然而,使用mongodb来作为存储层,在某些方面比mysql更为方便和适合。

littleschemer的博客 1700

题解|高效率求出乱序数组中的第k小元素

高效率求出乱序数组中的第k小元素 public class 最快效率求出乱序数组中的第k小元素 { public static void main(String[] args) { // TODO Auto-generated method stub int[] arr = { 9, 8, 4, 3215, 1, 54, 9, 3 }; System.out.println(f(a...

My Blog 398

R语言实战应用精讲50篇(二)-多重线性回归系列之稳健回归

前言 线性回归的参数估计主要采用的是最小二乘法(又称最小平方法),该法是将使观测值与模型预测值之差的平方达到最小的值作为参数估计值。如果数据存在异常点或者异方差,最小二乘法估计会存在偏差,常用的处理策略就是改用稳健回归(Robust Regression)。 稳健回归就是采用更为稳健的参数估计方法来拟合模型,所谓稳健就是数据的波动对参数估计影响不大,比如不受异常值影响,或删除某一观测后对结果影响不大。稳健估计的方法有很多,主要有这么几类:最小绝对值回归(也称最小一乘法回归,lAV),最小中位数二乘法(L

wenyusuran的专栏 3161

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

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

orangefly0214的博客 5万+

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

IEM模型,地表粗糙度模拟

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

[LeetCode]215 数组第k大的数

Kth Largest Element in an Array(数组第k大的数)【难度:Medium】 Find the kth largest element in an unsorted array. Note that it is the kth largest element in the sorted order, not the kth distinct element.For exa

在这一路上寻找。 1万+

efm32 入门.pdf

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

数组中的第k小数

描述 以尽量高效率求出乱序中的k小数 输入 第一行 数组长度 第二行 数组元素 空格隔开 第三性 第几小的数 输出 第k小的数 样例输入 5 6 1 2 9 3 8 2 样例输出 2 解题思路 利用快速排序找到主元的位置,判断主元是第几小的 主元位置大了剪掉右边的 主元位置小了剪掉左边的 假设要找第三小的数 主元的位置比最要找数大时剪掉右边的 主元的位置比要找的数小时剪掉左边的 代码示...

Tinknow324的博客 470

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

<<算法很美>>——(三)十大排序算法(下)

目录 1.奇数在左偶数在右 2.最快效率求出乱序数组中第k小的数 3.数组中有一个数字出现次数超过数组长度一半 4.合并两个有序数组 5.数组中的逆序对 6.排序数组中两个数字之和 7. 解决员工年龄问题​ 8. 拓展:把数组排成最小的数 1.奇数在左偶数在右 给定一个数列A,试将其变为奇数在左偶数在右的形式。例如A=[12,8,7,5,6,11],则变换后的A'=[11,5,7,8,6,12] 只需要先奇数后偶数即可,不需要排序。 思路: 题目要求奇数在...

m0_58367586的博客 3023

java查找第k大的数字_[经典算法题]寻找数组中第K大的数的方法总结

今天看算法分析是,看到一个这样的问题,就是在一堆数据中查找到第k个大的值。名称是:设计一组N个数,确定其中第k个最大值,这是一个选择问题,当然,解决这个问题的方法很多,本人在网上搜索了一番,查找到以下的方式,决定很好,推荐给大家。所谓“第(前)k大数问题”指的是在长度为n(n>=k)的乱序数组中S找出从大到小顺序的第(前)k个数的问题。解法1: 我们可以对这个乱序数组按照从大到小先行排序,然...

weixin_35197990的博客 2229

在N个乱序数字中查找第K大的数字

2. 经典的几种解法 2.1 解法一:O(n*k) 思想:利用冒泡排序或者简单选择排序,K次选择后即可得到第k大的数。总的时间复杂度为O(n*k)。 2.2 解法二:O(n*logk) 思想:维护一个k大小的最小堆,对于数组中的每一个元素判断与堆顶的大小,若堆顶较大,则不管,否则,弹出堆顶,将当前值插入到堆中。时间复杂度O(n * logk)。 2.3 解法三:O(n) 思想:利用快速...

coco的专栏 950

线性时间选择算法:高效求解乱序数组中的第 K 小元素

通过本文的介绍,我们深入了解了如何在乱序数组中高效地找到第 K 个元素的算法。从最初的先排序再选择的简单思路,到基于快速排序分区思想的线性时间选择算法,我们看到了算法优化的过程。Java 代码实现帮助我们将理论转化为实际可运行的程序,而时间复杂度分析让我们清楚地了解了算法在不同情况下的性能表现。这个算法在多个领域都有着重要的应用,能够帮助我们解决实际问题,提高程序的效率。希望大家通过学习,能够掌握这个算法的核心思想和实现方法,并在实际编程中灵活运用。

m0_57836225的博客 579

3.8 实践:最小可用id是多少-求乱序数组中缺失的最小数字

Chapter3: 更好的查找与排序算法 8. 实践:最小可用id是多少-求乱序数组中缺失的最小数字 问题 在乱序的非负数组中找到最小的可分配id(从1开始编号),数据量1000000。 意思就是求一个非负乱序数组中缺失的最小数字,因为id不能重复 算法 解法1:先排好序O(nlgn) 基本思想 先将数组排好序,然后循环比较输出第一个缺失的数 解法2:用分区的思想 基本思想 在数组...

bloger博客 441

数组常见算法

数组常见算法

m0_65347933的博客 1880

n个数字取第k大的数

 设计一组N个数,确定其中第k个最大值,方法很多,最直观的想法是将n个数由大到小排好序,取第k个数即可,但效率并不高。  网上的方法如下: 解法1: 我们可以对这个乱序数组按照从大到小先行排序,然后取出前k大,总的时间复杂度为O(n*logn + k)。       解法2: 利用选择排序或交互排序,K次选择后即可得到第k大的数。总的时间复杂度为O(n*k)       解法3: 利用...

FzBcumt的专栏 601

c++求区间第k大数_寻找第K大的数的方法总结

今天看算法分析是,看到一个这样的问题,就是在一堆数据中查找到第k个大的值。名称是:设计一组N个数,确定其中第k个最大值,这是一个选择问题,当然,解决这个问题的方法很多,本人在网上搜索了一番,查找到以下的方式,决定很好,推荐给大家。所谓“第(前)k大数问题”指的是在长度为n(n>=k)的乱序数组中S找出从大到小顺序的第(前)k个数的问题。解法1: 我们可以对这个乱序数组按照从大到小先行排序,然...

weixin_39830588的博客 2784

找第k大的数(方法汇总)

题目:n个数,确定其中第k个最大值。 数据输入:一行,n、k,空格隔开。 数据输出:一个数,第k大的数。 所谓“第(前)k大数问题”指的是在长度为n(n>=k)的乱序数组中S找出从大到小顺序的第(前)k个数的问题。 解法1: 我们可以对这个乱序数组按照从大到小先行排序,然后取出前k大,总的时间复杂度为O(n*logn + k)。...

abc201612的博客 198

数组常见算法代码总结

双指针遍历的方式进行查找:通过两个下标,分别从数组头部和尾部,同时对该无序数组进行遍历,将数组中的每个元素与指定元素进行比较,从而确定该数组中是否存在指定元素。二分查找的效率高效,是因为它在匹配不成功的时候,每次都能排除剩余元素中一半的元素。冒泡排序的特点是,每一轮循环后,最大的一个数被交换到末尾,因此,下一轮循环就可以“排除”最后的数,每一轮循环都比上一轮循环的结束位置靠前一位。遍历的方式进行查找:可以通过对该无序数组进行遍历,将数组中的每个元素与指定元素进行比较,从而确定该数组中是否存在指定元素。

2301_79694645的博客 1193
上一篇: 第三章:查找与排序(下)------------- 3.8题解_调整数组顺序-奇数在左偶数在右
下一篇: 访问vector元素方法的效率比较
Estrellas_
博客等级 码龄9年 273粉丝 233原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值