C++中sort函数

基本语法

首先,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);  //指定排序规则,从大到小
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值