nth_element算法
1.常对象2.类为什么要传引用3.为什么要用const修饰某个对象?
4.nth_element算法
5.sprintf函数和sscanf函数6.scanf为什么比cin要快?7.矩阵旋转8.C++中的位运算9.std::ios::sync_with_stdio(0) 加速10.约数和倍数的性质11.对于质数的研究12.最大公约数和最小公倍数13.sort函数中的第三个参数:自定义排序方式14.排序15.大根堆和小根堆的介绍16.next_permutation17.线性dp:大盗阿福(打家劫舍)18.线性dp:最长上升子序列19.线性dp:最长公共子序列20.线性dp:最长公共子串21.宏定义define的用法22.算法比赛中常用的快读nth_element
是 C++ STL 中非常强大的算法之一,用于在一个范围内找到第 k
小(或第 k
大)的元素,并将其放到正确的位置,使得所有小于或等于该元素的值在其左边,所有大于该元素的值在其右边。这个算法的关键特点是它在找到第 k
小的元素时,复杂度为 O(n),比起全排序的 O(n log n) 更高效。
函数原型
在 C++ 标准库中,nth_element
的函数原型定义在 <algorithm>
头文件中,如下所示:
template<class RandomIt> void nth_element(RandomIt first, RandomIt nth, RandomIt last); template<class RandomIt, class Compare> void nth_element(RandomIt first, RandomIt nth, RandomIt last, Compare comp);
参数解释
- first: 指向范围的开始。
- nth: 指向需要排在第
n
位的元素(0-based index)。 - last: 指向范围的结束。
- comp: (可选)自定义的比较函数,用于确定元素的顺序。它是一个二元谓词,用于比较两个元素。
主要特点
nth_element
会将范围[first, last)
部分排序,使得*nth
是该范围内第n
小的元素。元素的相对顺序在其左边和右边的元素之间可能不会保持,但*nth
左边的元素都小于或等于*nth
,右边的元素都大于或等于*nth
。- 这个算法通常比全排序算法(例如
sort
)要高效,特别是在你只需要找到中间某个元素时。
使用示例
以下是一些使用 nth_element
的示例,演示如何找到第 k
小的元素并进行部分排序。
示例 1: 找到第 k
小的元素
#include <iostream> #include <algorithm> #include <vector> int main() { std::vector<int> numbers = {7, 10, 4, 3, 20, 15}; // 找到第 3 小的元素(0-based index) auto nth = numbers.begin() + 2; // nth_element 的第三个参数是第 2 个元素 std::nth_element(numbers.begin(), nth, numbers.end()); // 输出结果 std::cout << "The third smallest element is " << *nth << std::endl; std::cout << "The partially sorted array: "; for (const auto& num : numbers) { std::cout << num << ' '; } std::cout << std::endl; return 0; }
在这个例子中,nth_element
将 numbers
部分排序,使得第三小的元素(也就是第 2
个索引位置上的元素)在 numbers
的正确位置上。结果显示 3
是第三小的元素,数组 [4, 3, 7, 10, 20, 15]
在 3
之前的元素都小于或等于 3
,而在 3
之后的元素都大于或等于 3
。
示例 2: 使用自定义比较函数
#include <iostream> #include <algorithm> #include <vector> bool compare(int a, int b) { return a > b; // 降序排序 } int main() { std::vector<int> numbers = {7, 10, 4, 3, 20, 15}; // 找到第 3 大的元素(0-based index) auto nth = numbers.begin() + 2; // 注意:要找到第 3 大的元素,索引是 2 std::nth_element(numbers.begin(), nth, numbers.end(), compare); // 输出结果 std::cout << "The third largest element is " << *nth << std::endl; std::cout << "The partially sorted array: "; for (const auto& num : numbers) { std::cout << num << ' '; } std::cout << std::endl; return 0; }
在这个示例中,使用了降序排序的比较函数 compare
。nth_element
会把第 3
大的元素放到正确的位置上,结果会显示出部分排序的数组和第三大的元素。
注意事项
- 合法性: 确保
nth
在[first, last)
范围内,保证nth_element
操作的正确性。 - 不完全排序:
nth_element
只保证第k
小(或大)的元素位置正确,其它元素的相对位置不会被完全排序。 - 性能:
nth_element
是一个高效的选择算法,适用于只需要部分排序的情况。它的时间复杂度是 O(n),而不是 O(n log n) 的完全排序。
nth_element
是一个非常强大的工具,可以用来高效地找到第 k
小的元素,非常适合在处理大型数据集时使用。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战