【算法】第 n 小数 nth_element

STL 中取第 n 小数的算法 nth_element 的函数原型如下

template<class RandomAccessIterator>
void nth_element(RandomAccessIterator first, RandomAccessIterator nth, RandomAccessIterator last);

算法说明:

1、功能:执行 nth_element 后,nth 所指位置的元素将是整个区间有序时在该处的元素。对 [first, nth) 中的任意迭代器 i 和 [nth, last) 中的任意迭代器 j,满足 !(*i > *j)。

2、要求:RandomAccessIterator 必须满足 ValueSwappable。*first 的类型必须满足 MoveConstructible 和 MoveAssignable。

3、复杂度:平均为线性。

源码如下:

template <class RandomAccessIterator>
void nth_element(RandomAccessIterator first, RandomAccessIterator nth, RandomAccessIterator last) {
	while (last - first > 3) {
		RandomAccessIterator cut = unguarded_partition(first, last, Type(median(
			*first,
			*(first + (last - first) / 2),
			*(last - 1))));
		if (cut <= nth) {
			first = cut;
		} else {
			last = cut;
		}
	}
	insertion_sort(first, last);
}

其中的 unguarded_partition 和 insertion_sort 在之前介绍过,这里不再列出它们的源码。

函数中的 first 和 last 可能改变,当 [first, last) 区间大于3时就一直划分,划分是采用三者取中的方式以缓解输入时的糟糕情况,每次划分后产生两段,若右段起点 cut <= nth,则再对右段划分,否则对左段划分。直到区间长度小于等于3时,索性对这个小区间进行插入排序,注意 nth 始终在 [first, last) 中。

【算法】第 n 小数 nth_element,码迷,mamicode.com

时间: 2024-08-24 10:04:41

【算法】第 n 小数 nth_element的相关文章

nth_element 测试程序

1 /******************************************************************** 2 created: 2014/04/29 11:35 3 filename: nth_element.cpp 4 author: Justme0 (http://blog.csdn.net/justme0) 5 6 purpose: nth_element 7 **********************************************

verilog实现rgb2gray

前言 项目算法需求,需要将RGB彩色图像转换为灰度图像,算法原理是很简单的,但是对于刚接触FPGA的宝宝来说,进行时序的设计和调试还是不那么容易的,为了省事儿,就按照上一篇中值滤波(http://www.cnblogs.com/happyamyhope/p/5577898.html)的结构进行设计.开始的开始,只能根据已经做好的设计照葫芦画瓢,否则调试还是很繁琐的,主要是因为目前还是掌握不了时序设计的精髓和思路,慢慢来吧. 实验步骤: 1.实验原理介绍: 2.编写各模块的代码: 3.调试仿真,并

STL 源码剖析 算法 stl_algo.h -- nth_element

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie nth_element ------------------------------------------------------------------------------ 描述:重新排序,使得[nth,last)内没有任何一个元素小于[first,nth)内的元素, 但对于[first,nth)和[nth,last)两个子区间内的元素次序则无任何保证. 思路: 1.以 media

STL_算法_依据第n个元素排序(nth_element)

C++ Primer 学习中... 简单记录下我的学习过程 (代码为主) //全部容器适用 nth_element(b,n,e) nth_element(b,n,e,p) 对照:partition()算法 /**------http://blog.csdn.net/u010579068------**/ #include<iostream> #include<cstdio> #include<string> #include<vector> #include

大数与小数的求和算法

原文首发于我的微信公众号:GeekArtT . 在计算机求和的过程中,一个大数和小数的相加会因为浮点数的有限精度,而导致截断误差的出现.所以在构建计算网格的时候,都要极力避免这样情形的发生,将计算统一在相对较近的数量级上.所以,当需要对一系列的数值做加法时,一个好的技巧是将这些数由大到小做排列,再逐个相加. 而如果一定要做出这样的大数与小数的求和,一个直观想法就是:大数部分和小数部分的高位相加,将剩余的小数部分作为单独的"补全"部分相加.这种直观想法的官方名称叫做Kahan求和法. 假

对小数的四舍五入算法

Description: 仅仅能对最多6位小数进行四舍五入,注意小数末尾自己主动去0不占位(比如:1.20f被看做:1.2f),当传入的小数为2.0f这种小数时视为整数返回0: 被解决的问题: 在Unity3d圣典中的四舍五入函数Mathf.Round返回浮点数 f 进行四舍五入最接近的整数.假设数字末尾是.5,因此它是在两个整数中间,无论是偶数或是奇数,将返回偶数. Code:[C#,Unity3d圣典] float MyRound(float f) { string s = f.ToStri

(算法)精确表示小数

题目: 给定一个正整数n,求1/n的小数表示,如: 1/2=0.5 1/3=0.(3) 1/6=0.1(6) 1/7=0.(142857) 其中括号表示小数中的循环部分. 思路: 考虑一下除法运算的过程: 当余数与之前运算出现重复时,那么说明循环已经开始,因此可以通过hash表来记录余数对应的位置. 被除数 除数 余数 商 1 7 1 0 1*10         7 3 1 3*10    7  2 4 2*10 7  6   2    6*10    7  4 8 4*10 7  5 5 5

小数5.2500四舍五入保留1位小数的java算法之一

BigDecimal bd = new BigDecimal(5.2500); BigDecimal a = bd.setScale(1, BigDecimal.ROUND_HALF_UP); double b = a.doubleValue(); System.out.println(b);

sdut oj 2059 简单 n! (一个大数与一个小数相乘的算法 、一个大数与一个小数的除法算法 【模板】 )

简单n! Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 给定一个数n(0 <= n <= 150), 求0到n中所有数的阶乘. 输入 题目有多组数据,处理到文件结尾.输入一个数n. 输出 输出阶乘,形式如:4! = 24.每组数据输出后跟一个空行. 示例输入 1 4 示例输出 0! = 1 1! = 1 0! = 1 1! = 1 2! = 2 3! = 6 4! = 24 提示 代码: #include <stdi