一、作用

查找第n小的元素

二、用法

nth_element(起始地址,查找元素的下标,最后一个元素地址+1);
nth_element(起始地址,查找元素的下标,最后一个元素地址+1,自定义排序);

举例:
查找数组中第6小的元素

#include<iostream>
#include<algorithm>//必要头文件
using namespace std;
int main(){int a[10]={1,5,6,3,9,2,8,7,4,10};nth_element(a,a+5,a+10);//查找数组第6小的元素 cout<<"第6小的数是:"<<a[5];//第6小的数放在了相应的第6个位置了
}
//console:
//第6小的数是:6

那么能不能查找第n大的元素呢?
当然可以的,将第n大的问题转换为求第m小的问题就可以了
例如一个数组有10个元素,求第2大的数,那么它等同于求第10-2+1=9小的元素

#include<iostream>
#include<algorithm>//必要头文件
using namespace std;
int main(){cout<<"请问您需要查找第几大的数?" <<endl;int n;cin>>n; int a[10]={1,5,6,3,9,2,8,7,4,10};nth_element(a,a+10-n,a+10);cout<<"第"<<n<<"大的数是:"<<a[10-n];
}
//console:
//请问您需要查找第几大的数?
//2
//第2大的数是:9

自定义排序:
假如遇到无法直接比较大小的结构体怎么办呢?重载运算符是一种办法,也可以自定义排序,例:

#include<iostream>
#include<vector>
#include<algorithm>//必要头文件
using namespace std;
struct node{int x,y;
//  构造函数 node(int x,int y){this->x=x;this->y=y;}
};
bool cmp(node n1,node n2){return n1.x<n2.x;
}
int main(){vector<node> v;node n1(1,3);node n2(5,2);node n3(3,6);node n4(2,6);node n5(4,4);v.push_back(n1);v.push_back(n2);v.push_back(n3);v.push_back(n4);v.push_back(n5);nth_element(v.begin(),v.begin()+1,v.end(),cmp);cout<<"按x排序,第2小点的数是:"<<endl;cout<<"x:"<<v[1].x<<' '<<"y:"<<v[1].y;
}

函数的实现

与快速排序思路大致相同,例如一个数组有10个元素:4,3,9,1,8,6,5,10,2,7;

找第7小的元素:
第一步:开找第一个数,4,比4小的放在4左边,比4大的放在4右边
结果:3,1,2,4,9,8,6,5,10,7
结论:那么4是第4小的数,因为有3个比它小的元素在左边

第二步:第7小的元素肯定在4的右边,找4右边的第一个数,9,比9小的放在9左边,比9大的放在9右边
结果:3,1,2,4,8,6,5,7,9,10
结论:那么9是第9小的数,因为有8个比它小的元素在左边

第三步:第7小的元素肯定在9的右边,找9左边的第一个数,7,比7小的放在7左边,比7大的放在7右边
结果:3,1,2,4,6,5,7,8,9,10
结论:那么7是第7小的数,因为有6个比它小的元素在左边

得到第7小的数7,结束

时间复杂度平均为O(n),最差为O(n^2);
它把不必要的排序步骤省略掉了,复杂度大大降低

c++ nth_element()函数相关推荐

  1. Arithmetic Sequence 三分,货仓选址,nth_element,__int128(济南)

    题意 : 给一序列,每次操作选择一个数加一或者减一,需要将这个序列变成等差数列,问最小操作数 思路 : 数据范围很大又没有头绪,想到二分或者三分.对于不同的公差d,肯定是只有一个最优,两边的都比这个公 ...

  2. 利用向量叉积求三角形的面积(+STL:nth_element求第K大的数)

    牛客寒假算法集训营2 https://ac.nowcoder.com/acm/contest/327/A A.处女座的签到题 题目描述 平面上有n个点,问:平面上所有三角形面积第k大的三角形的面积是多 ...

  3. 随机生成数组函数+nth-element函数

    这几天做了几道随机生成数组的题,且需要用nth-elemeng函数,并且都是北航出的多校题-- 首先我们先贴一下随机生成数组函数的代码: 1 unsigned x = A, y = B, z = C; ...

  4. nth_element()

    1.头文件 #include<algorithm> 2.函数模板 default (1) template <class RandomAccessIterator>void n ...

  5. 理解你的排序操作(stable_sort,sort,partial_sort,nth_element,stable_partition,partition)

    排序一直是数据结构中的常用算法,STL提供的排序算法非常丰富,如何有效使用就值得探讨.在网上没有找到条款31的翻译,于是我自己翻译了.--Winter 如何进行排序?让我数数有几种方法. 一旦程序员需 ...

  6. C++标准库中各种排序归纳

    一.简介 所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作.我们在编程过程中会经常接触到排序,比如游戏中的排行榜等.C++标准库中提供了各种不同的排序算法,这篇博 ...

  7. 【LeetCode 剑指offer刷题】查找与排序题14:Wiggle Sort(系列)

    [LeetCode & 剑指offer 刷题笔记]目录(持续更新中...) Wiggle Sort II Given an unsorted array nums, reorder it su ...

  8. 牛客 - 第k小数(线性寻找第 k 小数)

    题目链接:点击查看 题目大意:给出长度为 n 的数列 a ,要求找到第 k 小的数 题目分析:因为数据给的足够大,所以约束就是必须线性完成操作,STL 中的 nth_element() 函数可以完美实 ...

  9. 时间排序_你懂使用C ++ STL在线性时间内查找未排序数组的中位数吗

    也许你现在还在愁着学习C++?您不知道该怎么使用C++ST在线性时间内查找未排序数组的中位数,那么本文就用几组代码教您查找. 给定具有N个元素的未排序数组 arr [],任务是找出线性时间复杂度的数组 ...

最新文章

  1. Java中泛型的使用场景
  2. PHP中的include、include_once、require、require_once
  3. canvas 在线画图
  4. clickhouse hbase性能对比_如何让 HBase 更快、更稳、更省钱
  5. Android中的Handler总结
  6. 罗振宇2021跨年演讲2:除了规模中国还有什么优势?
  7. fcn网络训练代码_FCN网络训练 菜鸟版
  8. 清空所有textbox
  9. python之---子类父类属性之间的关系
  10. “焊”卫锂电 | 昂视锂电池密封钉视觉检测应用详解
  11. it行业se是_CS、IT、SE到底有什么区别?
  12. ArcGIS教程 - 4 GIS数据
  13. VMware16安装苹果OS及如何unlock(亲测有效)
  14. 帕德逼近matlab算法,帕德逼近matlab
  15. 2023年提高Google关键词排名的方法,如何提高谷歌排名?
  16. 世界主要电信运营商总结
  17. 根据年月日判断该日是这一年的多少天 C语言
  18. 游戏系列~苍穹世界(5)
  19. 三维GIS系统在城市发展中的应用
  20. ExtJS - Desktop - 开发豆瓣FM应用

热门文章

  1. 机器人彩铅画_高达机器人铅笔画图片
  2. 细数二十世纪最伟大的10大算法(Top10)
  3. 轻触开关实现自锁功能
  4. PaaS,BLT模型中的一部分
  5. Rocket-api 调研
  6. surface pro java_全新SurfacePro评测 可以理解为SurfacePro4的进化版
  7. 一本通1527欧拉回路
  8. TCGA差异表达分析|2022.5.1更新
  9. 【PTA】 试试手气
  10. Redis 初解缓存