快速选择算法 C++ 标准库函数:nth_element

👨‍💻 关于作者:会编程的土豆

"不是因为看见希望才坚持,而是坚持了才看见希望。"

你好,我是会编程的土豆,一名热爱后端技术的Java学习者。

📚 正在更新中的专栏:

💕作者简介:后端学习者

先看例题:

cpp 复制代码
class Solution {
public:
    int findKthLargest(vector<int>& nums, int k) {
        nth_element(nums.begin(), nums.end() - k, nums.end());
        return nums[nums.size() - k];
    }
};

对,就是这么简单,完了,而且速度极快,时间复杂度为O(n);

下面仔细阐述一下这个库函数:

nth 是 "n-th" 的缩写,意思是 "第 n 个"。

拆解

  • n:表示一个整数序号

  • th:英语序数词后缀(如 4th, 5th, 6th)

  • 合起来 n-th:第 n 个

在函数名中的含义

std::nth_element 直译就是 "第 n 个元素"。

它的作用是:把容器中如果完全排序后,应该排在第 n 个位置的那个元素 放到第 n 个位置。

下标从0开始的哦

作用把第二个参数表示的那个位置 "应该排在那个位置的元素"放过去,且不保证其他元素有序。

cpp 复制代码
nth_element(nums.begin(), nums.end() - k, nums.end());
//           ↑             ↑                 ↑
//         起始迭代器    目标位置迭代器      结束迭代器
  • nums.end() - k 就是倒数第 k 个位置

  • 因为是升序排序,倒数第 k 个位置就是第 k 大的元素所在的位置

举例

数组 [3,2,1,5,6,4],k = 2:

  • 完全排序后是 [1,2,3,4,5,6]

  • 第 2 大是 5,在倒数第 2 个位置(下标 4)

  • nth_element 后数组变成类似 [3,2,1,4,5,6](不唯一)

  • 下标 4 的元素必定是 5

复杂度

维度 复杂度
时间 平均 O(n),最坏 O(n²)(但标准库通常用 Introselect 保证 O(n))
空间 O(1)

其他语言的类似函数

语言 等价函数
C++ std::nth_element
Python heapq.nlargest(k, nums)[-1] 或 sorted(nums)[-k]
Java Arrays.sort(nums); return nums[nums.length - k];
相关推荐
fensnote14 分钟前
西门子 S7 PLC 内部寄存器读写 Demo(C 语言)
c语言·开发语言
benchmark_cc1 小时前
量化项目启动时,应该先设计数据接口还是先编写策略?从系统架构角度做出正确选择
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
2601_962885721 小时前
如何用 Python 判断一只股票“追涨”还是“抄底”更有效?
android·开发语言·python
把我格子衫拿来1 小时前
VTK 与 Qt 的 CMake 工程怎么组织?模块、工具链与二进制兼容排错
c++·qt·vtk·cmake·工程实践
denlaku1 小时前
JDK 15 新特性详解
java·开发语言
滴滴答答哒1 小时前
C# 技巧:优雅实现对象的“局部更新”与“字段合并”
开发语言·c#
总裁余(余登武)1 小时前
K-means算法改进(Python版)
python·算法·kmeans
灯澜忆梦2 小时前
【面向对象编程c++】| 指针与自定义数据类型
开发语言·c++·算法
Brilliantwxx2 小时前
【Linux】 自主shell编写巩固复习篇
linux·运维·服务器·开发语言
十年Java程序媛2 小时前
Java 多线程基础与锁机制详解|进程线程、锁升级、synchronized 与 Lock 对比
java·开发语言·spring boot