基本语法
首先,C++中使用sort函数的时候需要加上头文件#include<algorithm>
。
并且sort函数的语法格式为:
void sort (RandomAccessIterator first, RandomAccessIterator last);
也可以自定义排序规则comp
void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);
注意:从sort函数语法格式中的RandomAccessIterator
就能看出,sort只能用在容器支持的迭代器类型必须为随机访问的迭代器。
复杂度
STL的sort()算法,数据量大时采用快速排序(Quick Sort),分段递归排序。一旦分段后的数据量小于某个阈值,为避免Quick Sort的递归调用带来过大的额外开销,就改用Insertion Sort(插入排序)。如果递归层次过深,还会改用Heap Sort(堆排序)。
因此平均时间复杂度为:O(nlogn)
哪些容器能用sort函数
string容器
vector容器
deque容器
以上三种容器都可以使用sort函数。
以下几种容器不能使用sort函数。
C++中,set 和 map 分别提供以下三种数据结构,其底层实现以及优劣如下表所示:
集合 | 底层实现 | 是否有序 | 数值是否可以重复 | 能否更改数值 | 查询效率 | 增删效率 |
---|---|---|---|---|---|---|
std::set | 红黑树 | 有序 | 否 | 否 | O(nlogn) | O(nlogn) |
std::multiset | 红黑树 | 有序 | 是 | 否 | O(nlogn) | O(nlogn) |
std::unordered_set | 哈希表 | 无序 | 否 | 否 | O(1) | O(1) |
红黑树是一种平衡二叉搜索树,所以key值是有序的,但key不可以修改,改动key值会导致整棵树的错乱,所以只能删除和增加。
映射 | 底层实现 | 是否有序 | 数值是否可以重复 | 能否更改数值 | 查询效率 | 增删效率 |
---|---|---|---|---|---|---|
std::map | 红黑树 | key有序 | key不可重复 | key不可修改 | O(nlogn) | O(nlogn) |
std::multimap | 红黑树 | key有序 | key可重复 | key不可修改 | O(nlogn) | O(nlogn) |
std::unordered_map | 哈希表 | key无序 | key不可重复 | key不可修改 | O(1) | O(1) |
此外,map支持下标操作,set不支持下标操作。
以上两表来源
从上面表格可以看出set、multiset、map、multimap、unordered_set、unordered_map都不能使用sort函数进行排序。
如果需要将其排序的话,需要借助vector容器。
unordered_map<char, int> map;
//map容器赋值后,再新建一个vector容器,并初始化如下:
vector<pair<char, int>> v(map.begin(), map.end());
从而再借助自定义的sort函数中comp
排序规则
//以map中value值的升序排序
bool mysort(pair<char, int>& p1, pair<char, int>& p2) {
return p1.second < p2.second;
}
//从而运用sort函数排序
sort(v.begin(), v.end(), mysort);
对于list容器的sort函数,不能使用algorithm
下的sort()
函数,但是可以使用list容器自带的sort进行排序
list<int> l;
l.sort(); //默认从小到大排序
也可以自定义排序
bool myCompare(int val1 , int val2)
{
return val1 > val2;
}
l.sort(myCompare); //指定排序规则,从大到小