前言
- 排序算法需要通过随机访问迭代器来访问容器中的元素,因此有的容器就不支持排序算法。
- STL容器的排序,支持随机访问的容器vector,deque,string没有sort成员,可调用std::sort排序;list排序调用自带的list::sort。
- 注意
std::sort 要求随机访问迭代器且不能用于 list 。此函数与 std::sort 的区别在于,它不要求 list 的元素类型可交换,保留所有迭代器的值,并进行稳定排序。
- 注意
- sort函数有以下特征:
- 要求输入一个范围[first, last)
- 随机迭代器,能用此算法的容器是支持随机访问的容器:vector, deque, string。
- 对于list容器,list自带一个sort成员函数list::sort()。它和算法函数中的sort差不多,但是list::sort是基于指针的方式排序,也就是说,所有的数据移动和比较都是此用指针的方式实现,因此排序后的迭代器一直保持有效(vector中sort后的迭代器会失效)。
sort函数
- 默认的为升序
- 第三参数——比较函数。比较函数是一个自己定义的函数,返回值是bool型(一般),它规定了什么样的关系
- 排序的数据类型不局限于整数,只要是定义了小于运算的类型都可以,比如字符串类string。
- 如果是没有定义小于运算的数据类型,或者想改变排序的顺序,就要用到第三参数——比较函数。
vector<int> v;
sort(v.begin(), v.end(), greater<int>());
sort(a, a+n, cmp);
- 对数组进行排序,其头文件为algorithm.h,形式为
sort(数组名,数组名+数组长度)
,默认为升序,复杂度为nlog(n); - 加
#include<functional>
因为用了greater<int>()
sort(begin, end, less<数据类型>()),升序;
sort(begin, end, greater<数据类型>()),降序;
sort(数组名,数组名+数组长度,less<数组数据类型>()),升序;
sort(数组名,数组名+数组长度,greater<数组数据类型>()),降序。