c++ sort与stable_sort的区别与自定义排序的使用

本文深入探讨了C++标准库中的sort与stable_sort算法的区别。sort基于快速排序,平均时间复杂度为O(nlogn),但稳定性未知;stable_sort基于归并排序,同样拥有O(nlogn)的时间复杂度,但能确保排序的稳定性,即相同元素的相对位置不变。通过自定义比较函数的示例,展示了如何使用stable_sort保持元素的原始顺序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

sort的实现是基于快速排序的,快速排序在比较算法中算是速度最快的,平均的时间复杂度为O(nlogn),虽然它的最差时间复杂度可能达到O(n2)。

stable_sort的实现是基于归并排序的,它的时间复杂度为O(nlogn),一般情况下,它比快速排序稍慢。但是它是一种稳定排序,所谓稳定排序,就是说相同大小的元素,在排序前后的相对位置不会发生改变。即相同大小的元素中,原来在前的元素,排序之后还是在前面。

它们使用时都需要#include<algorithm>

不过你可能会有疑问,既然是一样的元素,为何我们还有管谁前谁后?因为这里我们所说的一样,是指在比较的时候大小一样,并不一定就是说这两个元素完全一样,比如我们有时候会自定义比较函数:

//我们按对组的第一个元素大小对对组进行排序
bool cmp(pair<int, char> a, pair<int, char> b)
{
	return (a.first>b.first);//>表示从大到小,<表示从小到大(注意这里return 0是不移动元素,return 1是移动元素,
        //也就是说a.first==b.first时return 0不改变原来的顺序,vs中相等情况必须返回0)
}


int main()
{
	vector<pair<int, char>>v;
	v.push_back(make_pair(1, 'a'));
	v.push_back(make_pair(1, 'b'));
	v.push_back(make_pair(2, 'a'));
	v.push_back(make_pair(3, 'a'));
	
	stable_sort(v.begin(),v.end(),cmp);
	for (auto x : v)
	{
		cout << x.first << " " << x.second<<endl;
	}
	
}

输出为:

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值