查找第k小的数

news/2025/10/28 12:33:08/文章来源:https://www.cnblogs.com/kafkahaomei/p/19171487

// 全局变量
k2:整数 // 存储基准值的最终位置
len: 整数 // 存储当前分区长度
// 分区函数
函数 partition(a: 整数数组, left: 整数, right: 整数) 返回 整数数组指针:
m = a[left] // 选择第一个元素作为基准值
l = 0 // 左指针,从0开始
len = right - left // 当前分区长度
r = right - left // 右指针,从末尾开始
// 创建临时数组b
b = 新建整数数组[长度: right-left+1]
// 遍历原数组(跳过基准元素)
对于 i 从 left+1 到 right:
如果 a[i] < m:
b[l] = a[i] // 小于基准值,放左边
l = l + 1
否则:
b[r] = a[i] // 大于等于基准值,放右边
r = r - 1
k2 = r + 1 // 记录基准值最终位置
b[r] = m // 放置基准值到正确位置
返回 b
// 查找第k小元素的函数
函数 find(a: 整数数组, left: 整数, right:整数, k: 整数) 返回 整数:
b = partition(a, left, right) // 进行分区
如果 k2 == k:
返回 b[k2-1] // 基准值正好是第k小元素
否则如果 k2 < k:
// 目标在右分区,在右分区中查找第(k-k2)小的元素
返回 find(b, k2, len, k-k2)
否则:
// 目标在左分区,在左分区中查找第k小的元素
返回 find(b, 0, k2-1, k)
2.最好情况时间复杂度:O(n)
发生条件:每次分区都能将数组均匀划分
第一次分区:O(n)
第二次分区:O(n/2)
第三次分区:O(n/4)
总时间:n + n/2 + n/4 + ... ≈ 2n = O(n)
最坏情况时间复杂度:O(n²)
发生条件:每次分区都极度不平衡
第一次分区:O(n)
第二次分区:O(n-1)
第三次分区:O(n-2)
总时间:n + (n-1) + (n-2) + ... + 1 = n(n+1)/2 = O(n²)
3.分治法不仅是一种算法技术,更是一种系统化的问题解决方法论。它教会我们:
分解复杂性:任何复杂问题都可以拆解
递归求解:用相同模式解决子问题
整合成果:部分解可以合成完整解
这种思维方式在计算机科学之外的很多领域同样适用,体现了计算思维在解决各类问题中的普适价值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/948686.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

三金.紫题题解

点击查看代码 </details>\#include <bits/stdc++.h>using namespace std; using ll = long long;const int MOD = 998244353; const int G = 3;// 快速幂 ll qpow(ll b, ll e) {ll res = 1;b %= MOD;while…

conda环境离线迁移

有时候会遇见这样一种情况:conda环境非常难装,还需要在不同服务器上装,这时装完第一台不想麻烦,就可以打包离线安装 激活环境 conda activate myenv安装打包工具 conda install -c conda-forge conda-pack打包 con…

Java 条件结构

Java 条件结构 boolean 数据类型 boolean 数据类型用于声明取值仅为 true(真)或 false(假)的变量,是构成条件判断的基础。 以下场景均可用 boolean 类型表示判断结果:一件艺术品是真货还是假货 地铁 2 号线的首发…

1226. 哲学家进餐

1226. 哲学家进餐 题目描述5 个沉默寡言的哲学家围坐在圆桌前,每人面前一盘意面。叉子放在哲学家之间的桌面上。(5 个哲学家,5 根叉子) 所有的哲学家都只会在思考和进餐两种行为间交替。哲学家只有同时拿到左边和右…

nginx服务配置

特点工作进程抢占机制同时保持长连接和接收新的请求模块体系,很多lb只是用于网站正向代理,代理的客户端,知道自己访问的地址a客户端,访问谷歌中间是一个欧美的服务器代理浏览器,从而实现访问反向代理 ,代理的是服…

Java流程控制——if选择结构

Java流程控制——if选择结构If单选择结构 If(布尔表达式){ //若布尔值为真,则执行该语句 } import java.util.Scanner;public class If_demo01 {static void main(String[] args) {Scanner sc = new Scanner(System.i…

python 界面开发

Pyside6和python的对应关系 https://wiki.qt.io/Qt_for_Python

CTP制版设备品牌权威推荐:洞察行业翘楚,赋能印刷未来

在数字化浪潮席卷全球的今天,印刷产业正经历着前所未有的智能化变革。计算机直接制版技术,即CTP,作为连接数字设计与物理印刷的关键桥梁,其设备的性能、稳定性与创新性直接决定了印刷企业的生产效率与最终成品质量…

「Note」计算几何

计算几何基础计算几何基础 点积与叉积 点积 对于 \(\vec a, \vec b\),定义其点积: \[\vec a\cdot \vec b = |\vec a| |\vec b| \cos \langle \vec a, \vec b\rangle = x_a x_b + y_a y_b \]一般用于判断两向量夹角。…

从 “报表堆里找问题” 到 “实时预警止损”:MyEMS 如何终结能源管理低效?

在双碳目标与成本压力的双重驱动下,能源管理早已成为企业运营的核心环节 —— 但许多企业仍被困在 “报表堆里找问题” 的传统模式中:月底汇总数据、人工核对报表、发现异常时能耗浪费已发生、整改措施滞后于损失,这…

[PaperReading] Breaking the Modality Barrier: Universal Embedding Learning with Multimodal LLMs

目录Breaking the Modality Barrier: Universal Embedding Learning with Multimodal LLMsTL;DRMethod阶段一:Textual Discriminative Knowledge Distillation阶段二:Hard Negative Enhanced Instruction Tuning过滤…

【CI130x 离在线】语音芯片如何判断TTS音频播放完毕?

这个函数通过以下几个条件来综合判定TTS播放结束: 主要判定逻辑: 1. 缓冲区数据检查c#if NET_AUDIO_PLAY_BY_MP3 if (xStreamBufferBytesAvailable(mp3_player) == 0) // 播放完成 #elif NET_AUDIO_PLAY_BY_PCM || N…

完整教程:Qt信号与槽在多线程编程中的应用与注意事项

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

从 “短期达标” 到 “长期优化”:MyEMS 如何帮企业建立可持续的能源管理体系?

能源管理体系:短期与长期目标解析 在当今追求可持续发展的时代,能源管理体系对于企业而言至关重要。它犹如企业能源管理的指南针,引导企业在能源利用的道路上不断优化前行。能源管理体系的目标可以大致分为短期达标…

四场比赛(三)

0.前言 不会二项式反演了。 1.正文 20251028 我怒了。我不会二项式反演了。哭了。

使用DAST发现Android应用API中的AWS凭证泄露漏洞

本文详细介绍了如何通过动态应用安全测试(DAST)技术,在Android应用API中发现泄露的AWS凭证,这些凭证可能导致AWS基础设施被接管,包含完整的测试环境搭建和漏洞发现过程。发现隐藏威胁:我如何使用DAST在Android应用…

百航鹿大联训 Pwn篇

好难我靠,太难了。 四个人就我一个是主攻binary的,什么汇编、堆栈、计组一个没学,在人家机房里像个飞舞。 干巴爹。 hitb2018_gundam 纪念一下,人生第一道做出来(呃,复现出来)的Pwn题。人家教练交代的任务说什么…

开发stm32-配置vscode环境

第一步: 下载编译工具: 第二步: 打开vscode,安装相关插件。第三步:生成文件 (1)打开命令面板(Ctrl+Shift+P)输入并选择 C/Cpp: Edit Configurations (UI)。 第四步:配置c_cpp_properties.json 参照以下配置:…

iNeuOS工业互联网操作系统,增加工厂模型配置,继续深入业务

这次增加《生产工厂》模型配置,面向集团业务场景,可以增加多个工厂、每个工厂配置多个工序和班制信息。后续继续深化面向智能制造生产一体化管控具体业务,实现能源监测、能源统计和分析等功能模块。1. 概述 之前…

C++语法—类的声明和定义

一、 类的声明和定义 class 类名 {public:数据成员的声明成员函数的声明private:数据成员的声明成员函数的声明protected:数据成员的声明成员函数的声明 } 自生类的对象不可以作为该类的成员,但自生类的指针或引用可以…