STL之排序

1. 所有STL sort算法函数的名字列表:

函数名             功能描述

sort          对给定区间所有元素进行排序

stable_sort     对给定区间所有元素进行稳定排序

partial_sort     对给定区间所有元素部分排序

partial_sort_copy    对给定区间复制并排序

nth_element     找出给定区间的某个位置对应的元素

is_sorted               判断一个区间是否已经排好序

partition         使得符合某个条件的元素放在前面

stable_partition      相对稳定的使得符合某个条件的元素放在前面

2. 比较函数:

当你需要按照某种特定方式进行排序时,你需要给sort指定比较函数,否则程序会自动提供给你一个比较函数

vector < int > vect;

sort(vect.begin(), vect.end());//此时相当于调用

sort(vect.begin(), vect.end(), less<int>() );

sort 中的其他比较函数

equal_to 相等

not_equal_to 不相等

less 小于

greater 大于

less_equal 小于等于

greater_equal 大于等于

上述例子中系统 自己为sort提供了less仿函数。在STL中还提供了其他仿函 数,以下是仿函数列表: 不能直接写入仿 函数的名字,而是要写其重载的()函数: less<int>();

当你的容器中元 素时一些标准类型(int float char)或者string时,你可以直 接使用这些函数模板。但如果你时自己定义的类型或者你需要按照其他方式排序,你可以有两种方法来达到效果:一种是自己写比较函数另一种是重载类型的‘<‘操作赋

3. 全排序:

全排序即把所给定范围所有的元素按照大小关系顺序排列。sort采用的是成熟的"快速排序算法"(目前大部分STL版本已经不是采用简单的快速排序,而是结合内插排序算法)。复杂度为n*log(n)。stable_sort采用的是"归并排序",分派足够内存时,其算法复杂度为n*log(n), 否则 其复杂度为n*log(n)*log(n),其优点是会保持相等元素之间的相对位置在排序前后保持一致。

用于全排序的函 数有:

1.void sort(RandomAccessIterator first, RandomAccessIterator last);

2.void sort(RandomAccessIterator first, RandomAccessIterator last,StrictWeakOrdering comp);

3.void stable_sort(RandomAccessIterator first, RandomAccessIterator last);

4.void stable_sort(RandomAccessIterator first, RandomAccessIterator last, StrictWeakOrdering comp);

4. 局部排序:

partial_sort采用的堆排序(heapsort),它在任何情况下的复杂度都是n*log(n)。

局部排序其实是为了减少不必要的操作而提供的排序方式。

其函数原型为:

4.1 void partial_sort(RandomAccessIterator first, RandomAccessIterator middle,RandomAccessIterator last);

4.2 void partial_sort(RandomAccessIterator first,RandomAccessIterator middle,RandomAccessIterator last, StrictWeakOrdering comp);

4.3 RandomAccessIterator partial_sort_copy(InputIterator first, InputIteratorlast,RandomAccessIteratorresult_first,RandomAccessIterator result_last);

4.4 RandomAccessIterator partial_sort_copy(InputIterator first, InputIteratorlast,RandomAccessIteratorresult_first,RandomAccessIterator result_last, Compare comp);

例如:班上有1000个学生,我想知道分数最低的5名是哪些人。

partial_sort(vect.begin(),vect.begin()+5,vect.end(),less<student>());

5. nth_element 指定元素排序

5.1 void nth_element(RandomAccessIterator first, RandomAccessIterator nth, RandomAccessIterator last);

5.2 void nth_element(RandomAccessIterator first, RandomAccessIterator nth,RandomAccessIterator last,

StrictWeakOrdering comp);

例如:班上有1000个学生,我想知道分数排在倒数第4名的学生。

nth_element(vect.begin(), vect.begin()+3, vect.end(),less<student>());

6. partition 和stable_partition

partition就是把一个区间中的元素按照某个条件分成两类,并没有排序。

其函数原型为:

6.1 ForwardIterator partition(ForwardIterator first, ForwardIterator last, Predicate pred)

6.2 ForwardIterator stable_partition(ForwardIterator first, ForwardIterator last, Predicate pred);

例如:班上10个学生,计算所有没有及格(低于60分)的学生:

student exam("pass", 60);

stable_partition(vect.begin(), vect.end(), bind2nd(less<student>(), exam));

7. 效率由高到低(耗时由小变大):

partion

stable_partition

nth_element

partial_sort

sort

stable_sort

8. Effective STL对如何选择排序函数总结的很好:

8.1 若需对vector, string, deque, 或array容器进行全排序,你可选择sort或stable_sort;

8.2 若只需对vector, string, deque, 或array容器中取得top n的元素,部分排序partial_sort是首选.

8.3 若对于vector, string, deque, 或array容器,你需要找到第n个位置的元素或者你需要得到top n且不关系top n中的内部 顺序,nth_element是最 理想的;

8.4 若你需要从标准序列容器或者array中把满足某个条件 或者不满足某个条件的元素分开,你最好使用partition或stable_partition;

8.5 若使用的list容器,你可以直接使用partition和stable_partition算法,你可以使用list::sort代替sort和stable_sort排 序。

STL之排序

时间: 2024-08-25 03:09:43

STL之排序的相关文章

STL中排序算法的选择

 当大多数程序员需要对一组对象进行排序的时候,首先想到的一个算法是sort.sort是一个非常不错的算法,但它也并非在任何场合下都是完美无缺的.有时候我们并不需要一个完全的排序操作.比如说,如果我们有一个存放Widget的矢量,而我们希望将质量最好的20个Widget送给最重要的顾客,按照顾客的重要程度送上不同质量的Widget,那么只需要排序出前20个最好的Widget,其他的Widget可以不用排序.在这种情况下,需要的是一种部分排序的功能,而有一个名为partial_sort的算法正好

实验7:Problem H: STL——字符串排序

Description 对N个字符串排序. 0<N<=50000.每个字符串长度不超过50000,所有字符串长度总和不超过1000000. Input 第一行读入N. 后面N行,每行一个字符串(只包含字母). Output 输出共N行,按字典序从小到大输出. Sample Input 5 bcdef qwer tyuiphdjf asdfghjklzzzz z Sample Output asdfghjklzzzz bcdef qwer tyuiphdjf z HINT 用STL的string

CodeForces Gym 100685J Just Another Disney Problem (STL,排序)

题意:给定你大小未知的n个数,你允许有不超过一万次的询问,每次询问两个数,第i个数是否比第j个数小?然后后台会返回给你一个结果YES或者NO(即一行输入), 然后经过多次询问后,你需要给出一个正确的原未知序列的升序排列. 析:当时是真没看懂题意是啥意思,然后就放过了,如果看懂了,并不是很难么,这不就是一个排序么,你可以问后台要数据,然后你决定怎么排序, 我们只要处理这个排序就好,但是不能用sort进行排序,因为这个的复杂度并总不是nlogn,如果是极端数据就卡不过了,也就是说可能会超过询问100

STL常用排序算法介绍

merge() 以下是排序和通用算法:提供元素排序策略 merge: 合并两个有序序列,存放到另一个序列. #include <iostream> #include <cstdio> #include <algorithm> #include <vector> using namespace std; void printV(vector<int> &v) { for (vector<int>::iterator it = v

C++ STL之排序算法

排序算法和查找算法差不多,也涉及到迭代器区间问题,关于该问题的注意事项就不在啰嗦了 一.全部排序sort.stable_sort sort是一种不稳定排序,使用时需要包含头文件algorithm 默认可以传两个参数或三个参数.第一个参数是要排序的区间首地址,第二个参数是区间尾地址的下一地址.如果只传入这两个地址的话,就按照升序对指定地址区间排序.想要按照降序排列的话,需要传入第三个函数,第三个函数可以自己写cmp,也可以直接调用库函数 greater<data-type>(),使用库函数的时候

STL中排序算法

[1]    push_heap:默认为大根堆,主要是上滤操作. [2]    make_heap:创建堆,默认构建大根堆.他的实现基于这样一个简单的想法:将二叉树中的每个仅二层的子树都构成堆,那么整个数据集的布局几乎即可以满足堆的定义. [3]    pop_heap:将已构成堆的迭代器区间中最大值元素移到区间的最后元素位置.原来的最后元素调整为根结点元素后,再对除最后一个元素之外的区间调整. [4]    sort_heap:堆排序,时间复杂度O(nlog2n).内部通过一个while循环调

优先队列 stl 拓扑排序

2153: D.ly的排队问题 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 169  Solved: 73[Submit][Status][Web Board] Description 马上要上体育课了,上体育课之前总归是要排个队的,ly作为班长,怎么排队的问题只能由她来解决,但是马上要上课了,ly又不清楚所有人的身高,她又不好意思问每个人的身高,因为这样会显的自己很不负责,于是她只能通过肉眼观察...那么问题来了,她只能观察出两个人A和B谁高谁

C++11 STL容器 排序

1 struct temp{ int __iValue; int __iKey; }; 2 temp __Stru1 = { 100,100}; 3 temp __Stru2 = { 2,-10 }; 4 temp __Stru3 = { 200,1 }; 5 temp __Stru4 = { 600,2 }; 6 7 std::list<temp*> test_list; 8 test_list.push_back(&__Stru1); 9 test_list.push_back(&

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

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