STL中的各种排序函数

标准c++库中提供六种排序方法:qsort(),  sort(),stable_sort(),  partial_sort(),  list::sort(),  set/multiset

qsort()比sort()慢并且不能排序构造函数、虚函数,一般不推荐使用。写一个比较函数传递给qsort()很麻烦;

后五个排序中,前三个是泛型算法,后两个则使用了某些容器的特别特性。所有的这些都是使用operator()来比较对象,但是在必要时指定用户自己的比较函数。

后五个每个都提供了自己的特征:

1、sort() 通常速度最快

2、stable_sort() 保证了等价元素在顺序上的稳定

3、partial_sort()允许只排序出前N个元素

4、list::sort() 操纵指针,而不是拷贝元素

5、set允许在一个已序区间快速的插入和删除

标准模板库(STL)在库头文件<algorithm>中提供了几个排序函数。STL类List就有自己的内置的sort函数。对容器来说,List的sort函数比一般的排序算法快,因为它对列表进行了优化,而且是交换指针,不是复制对象。在排序双向队列、字符串、数组、或矢量时,使用一般的sort函数,注意这个sort函数不稳定,值相同的元素不能保证处于相同的顺序位置上,为此应使用stable_sort函数。只有在需要对一个区域的元素进行排序或分区时,其他排序算法才比较高效,如果只需要对一定区域的元素进行排序,可以使用partial_sort。该区域在参数中指定,partial_sort_copy函数会生成一个容器,其中包含指定区域的元素。Nth_element 函数可以对一定区域的元素进行部分排序,但只能保证第n个元素是分界点。在数组中第n个元素左边的所有元素会小于或等于第n 个,第n个元素右边的所有元素则大于第n个元素的值。注意在任意顺序中都不需要指定区域。Nth_element函数用于确定中间点或百分点。
       在根据某个条件对元素进行排序时,不是像nth_element函数那样对前n个元素排序,而是使用partion或stable_parition函数代替nth_element函数。这两个函数把容器分成两个区域,第一个区域包含满足特定条件的元素,第二个区域包含不满足特定条件的元素。最后,<algorithm>还包含merge和inplace_merge函数。但是,这两个函数都把已排序的区域作为参数,所以他们仅执行归并排序的一次调用。函数partition或stable_partition要求使用双向迭代器,而其他STL排序函数要求使用随机访问的迭代器。函数的规范如下所示。注意每个函数都有附加参数来确定排序的顺序,默认的比较运算符<。

                      2014-08-01

STL中的各种排序函数

时间: 2024-07-31 16:45:44

STL中的各种排序函数的相关文章

STL中各容器之函数总结

一.序列和关联非共有函数 所有标准库共有函数  (构造,相关属性,迭代器,插入与删除,比较,swap) 其中operator>,operator>=,operator<,operator<=,operator==,operator!=均不适用于priority_queue 顺序容器和关联容器共有函数 (1)   序列容器都提供5种相同的构造方法:关联容器都提供3种相同的构造方法 (2)    还有insert插入函数(序列容器有3个相同版本的插入.关联容器也有3个版本的) (3) 

编写STL中没有定义的函数(如果能编译)

实例目标:本例介绍如何编写标准模板库STL中没有定义的函数.这里列举两个例子,一个是将所有数据类型转换成字符串型的to_string函数,另一个是它的"反函数"from_string函数,用来将字符串转化为某一类型 具体内容: 在std::string模板中没有包含一些函数实用性较强的,原因就是因为客户轻易编写其中的代码.例如:可以实现一个将所有数据类型转换为字符串型的to_string函数代码如下: #include<iostream> template<class

STL 中的链表排序

一直以来学习排序算法, 都没有在链表排序上下太多功夫,因为用得不多.最近看STL源码,才发现,原来即使是链表,也能有时间复杂度为O(nlogn)的算法, 大大出乎我的意料之外,一般就能想到个插入排序. 下面的代码就是按照源码写出的(去掉了模板增加可读性),注意forward_list是C++11新加的单向链表,这里选这个是因为它更接近我们自己实现链表时的做法. void sort_list(forward_list<int>& l){ auto it = l.begin(); if (

Python 中的列表排序函数

sorted(iterable, cmp=None, key=None, reverse=False) L.sort(cmp=None, key=None, reverse=False) iterable:是可迭代类型;cmp:用于比较的函数,比较什么由key决定,有默认值,迭代集合中的一项;key:用列表元素的某个属性和函数进行作为关键字,有默认值,迭代集合中的一项;reverse:排序规则. reverse = True 或者 reverse = False,有默认值.返回值:是一个经过排序

jquery中去重复排序(函数: $.grep() join() sort() )

1.首先把字符串分割为数组(中文除外) var str = '12345678543'; var array = str.split ("");//分割为数组 console.log (array);结果如下: 2.去除重复值 //去除数组中重复的项 function uniQueue(array){ var arr=[]; var m; while(array.length>0){ m=array[0]; arr.push(m); array=$.grep(array,func

java中Collections.sort() 排序函数的用法

用Collections.sort方法对list排序有两种方法第一种是list中的对象实现Comparable接口,如下: /*** 根据order对User排序*/public class User implements Comparable<User>{    private String name;    private Integer order;    public String getName() {        return name;    }    public void 

C++ STL中的自定义排序和vector

优先队列priority_queue 优先队列一般写法 //队列头部值最大,大顶堆 priority_queue<int, vector<int>, greater<> >pq; //小大顶堆 priority_queue<int, vector<int>, less<> >pq; 自定义排序规则 自定义()运算符,传入两个参数,内部写> 实际上是从小到大排序与sort相反! 写法一: struct node { int to,

stl中常用的排序算法

#include"iostream" #include"vector" using namespace std; #include"string" #include"algorithm" void main_mergr() { vector<int > v1; v1.push_back(1); v1.push_back(2); v1.push_back(3); vector<int > v2; v2.p

STl中的排序算法

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