STL算法之排序算法

STL排序算法通常复杂度坏于线性,且必须要random-access Iterators。

所以,forward_list, list, associative and unordered contains 不提供随机访问迭代器,这些容器不能用排序算法。

但是,forward_list,list提供了成员函数sort,associative contains 自动排序,unordered contains不能排序。

通常,排序元素一次要比保持元素有序要更快。STL提供了不同的排序算法,根据需求选择适合的。

1.排序所有元素

1.1.普通排为有序

void

sort(RandomAccessIter beg, RandomAccessIter end);

使用operator < 排列元素为有序。历史上使用quicksort,但是since C++11使用introsort。

introsort正常使用quicksort,但是当复杂度要到平方时转换为heapsort。因此,

算法保证了复杂度nlogn,以前是“平均”复杂度nlogn。

//更改排序准则:

void

sort(RandomAccessIter beg, RandomAccessIter end, BinaryPredicate op);

使用op(elem1, elem2);二元谓词作为排序准则。

注意op必须是严格弱排序,在函数调用期间op不能改变状态。

1.2.保持相等元素的相对顺序的排序

void

stable_sort(RandomAccessIter beg, RandomAccessIter end, [BinaryPredicate op]);

相对于sort, 可以保持相等元素的相对顺序不变。

基于mergesort, 若有足够的外部内存:复杂度nlogn,否则,n*logn*logn的复杂度。

示例:

2.分割排序:保持一部分元素是有序的

void

partial_sort(RandomAccessIter beg, RandomAccessIter sortEnd,

RandomAccessIter end, [BinaryPredicate op]);

特点:不排序所有元素,只排序[beg, sortEnd),当这个区间有序后就停止排序。

若sortEnd == end, partial_sort()排序所有元素,平均情况下比sort()有更差性能,通常排序时间两倍于sort()。但是在最坏情况下有着更好性能。

通常使用heapsort,在任何情况下都保证了nlogn复杂度。

//排序同时复制版本:

3.根据某个位置排序:分割成两部分

void

nth_element(RandomAccessIter beg, RandomAccessIter nth, RandomAccessIter end, [BinaryPredicate op]);

将区间分割成:<=nth元素和>=nth元素两部分。或者根据op(elem1, elem2)分割。

第一个区间中元素<=第二个区间中任一元素。

适用于找出n highest或者lowest 元素。

线性复杂度。

由于你不知道排序后两个区间的确切排序准则,两个部分可能和nth有同样值。

4.根据确切的排序准则排序:不属于排序算法,属于Mutating Algorithm,所以不需要Random-access Iterator

(1) 移动元素到前端

ForwardIter

partion(ForwardIter beg, ForwardIter end, UnaryPredicate op);

BidirectionalIter

stable_partion(BidirectionalIter beg, BidirectionalIter end, UnaryPredicate op);

移动所有满足op(elem) == true的元素到区间前面。

stable_partion()维持匹配准则和不匹配准则的元素之间的相对顺序。

还需要分割复制元素时:用partion_copy()复制匹配准则的元素到到一个目的区间,不匹配准则的元素到另一个区间。

复杂度:

partion(): 线性。

stable_partion():有足够内存,线性(numElems交换和call op());否则,nlogn(numElems次call op(),numElems * log(numElems)交换)。

调用之后,不知道第一个和第二个期间的元素数量。

(2) 分割成两个子区间

pari<OutPutIter1, OutputIter2>

partion_copy(InputIter sourceBeg, InputIter sourceEnd

OutputIter1 destTureBeg, OutputIter2 destFalseBeg,

UnaryPredicate op);

根据op()分成两部分,满足部分放在destTureBeg, 不满足部分放在destFalseBeg。

当仅仅需要复制满足谓词的元素用copy_if(),复制不满足谓词的部分用remove_copy_if()。

线性复杂度。

STL算法之排序算法,布布扣,bubuko.com

时间: 2024-10-03 14:02:24

STL算法之排序算法的相关文章

STL源代码分析——STL算法sort排序算法

前言 因为在前文的<STL算法剖析>中,源代码剖析许多,不方便学习,也不方便以后复习.这里把这些算法进行归类,对他们单独的源代码剖析进行解说.本文介绍的STL算法中的sort排序算法,SGI STL中的排序算法不是简单的高速排序,而是交叉利用各种排序:堆排序.插入排序和高速排序:这样做的目的是提高效率.针对数据量比較大的採用高速排序,数据量比較小的能够採用堆排序或插入排序. 本文介绍了有关排序的算法random_shuffle.partition.stable_partition.sort.s

STl中的排序算法

本文转自:STl中的排序算法 1. 所有STL sort算法函数的名字列表: 函数名    功能描述 sort   对给定区间所有元素进行排序 stable_sort 对给定区间所有元素进行稳定排序 partial_sort 对给定区间所有元素部分排序 partial_sort_copy    对给定区间复制并排序 nth_element 找出给定区间的某个位置对应的元素 is_sorted               判断一个区间是否已经排好序 partition     使得符合某个条件的元

【C/C++学院】0907-象棋五子棋代码分析/寻找算法以及排序算法

象棋五子棋代码分析 编译代码报错: 错误 1 error MSB8031: Building an MFC project for a non-Unicode character set is deprecated. You must change the project property to Unicode or download an additional library. See http://go.microsoft.com/fwlink/p/?LinkId=286820 for mo

c/c++ 通用的(泛型)算法 之 只读算法,写算法,排序算法

通用的(泛型)算法 之 只读算法,写算法,排序算法 只读算法: 函数名 功能描述 accumulate 求容器里元素的和 equal 比较2个容器里的元素 写算法 函数名 功能描述 fill 用给定值,覆盖给定的范围的元素 fill_n 用给定值,覆盖给定开始位置后的,n个元素变 back_inserter 在容器末尾插入元素 copy 把容器1指定范围里的值拷贝给容器2,并返回指向容器2最后一个元素的下个元素 replace 用某个值替换掉给定范围的某个值 replace_copy 用某个值替

在Object-C中学习数据结构与算法之排序算法

笔者在学习数据结构与算法时,尝试着将排序算法以动画的形式呈现出来更加方便理解记忆,本文配合Demo 在Object-C中学习数据结构与算法之排序算法阅读更佳. 目录 选择排序 冒泡排序 插入排序 快速排序 双路快速排序 三路快速排序 堆排序 总结与收获 参考与阅读 选择排序 选择排序是一种简单直观的排序算法,无论什么数据进去都是 O(n2) 的时间复杂度.所以用到它的时候,数据规模越小越好.唯一的好处可能就是不占用额外的内存空间了吧. 1.算法步骤 首先在未排序序列中找到最小(大)元素,存放到排

算法之排序算法总结

算法之排序算法总结 | Carrie博客 全部 全部 博客 友链 关于 ps:这里的排序都是从小到大进行排列. 冒泡排序 算法思想:从第一个数开始,将两个相邻的数进行比较,如果前一个数大于后一个数,则互换位置,否则保持不变.这样比较一趟,可以把最大的数放在末尾(根据循环的趟数决定).依次循环,直到排序完成. 时间复杂度:O(n^2) 大专栏  算法之排序算法总结li>空间复杂度:O(1) 选择排序 算法思想:从待排序的数字中找出最小的数,放在排序数字的最开始,之后依次在未排序的数字中选出最小的数

算法学习-排序算法

数据结构-算法复杂度 时间复杂度 事件频度 一个算法花费的时间与算法种语句的执行次数成正比,哪个算法种语句执行次数多,它花费时间就多. 一个算法中的语句执行次数称为语句频度或时间频度.记为T(n) eg:计算1-100的和 方法一:for循环 T(n) = n + 1 方法二:直接计算 T(n) = 1 时间复杂度 一般情况下,算法中的基本操作语句的重复执行次数时问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n) / f(n) 的极限值为不等于0的常

STL中sort排序算法第三个参数_Compare的实现本质

关于C++ STL vector 中的sort排序算法有三种自定义实现,它们本质上都是返回bool类型,提供给sort函数作为第三个参数. 重载运算符 全局的比较函数 函数对象 我认为从实现方式看,重载运算符和函数对象实现本质上是一样的:两者都是括号运算符的重载. 重载运算符利用了泛型模板,再重载模板中的括号运算福,接着重载里面的大于小于操作符: 而函数对象则是直接针对自己的对象重载括号运算符. 下图是其中一个泛型模板比较函数,位于头文件stl_function.h中. 『注:本文来自博客园“小

c++STL之常用排序算法

sort:对容器元素进行排序 random_shuffle:洗牌,指定范围内的元素随机调整次序 merge:容器元素合并,并存储到另一容器中 reverse:反转指定范围内的元素 1.sort #include<iostream> using namespace std; #include <algorithm> #include <vector> #include <functional> //常用排序算法 sort void myPrint(int va