关于stable_sort()和sort()的区别:

 

你发现有sort和stable_sort,还有 partition 和stable_partition, 感到奇怪吧。其中的区别是,带有stable的函数可保证相等元素的原本相对次序在排序后保持不变。或许你会问,既然相等,你还管他相对位置呢,也分不清 楚谁是谁了?这里需要弄清楚一个问题,这里的相等,是指你提供的函数表示两个元素相等,并不一定是一摸一样的元素。

例如,如果你写一个比较函数:

bool less_len(const string &str1, const string &str2)
{
        return str1.length() < str2.length();
}

此时,"apples" 和 "winter" 就是相等的,如果在"apples" 出现在"winter"前面,用带stable的函数排序后,他们的次序一定不变,如果你使用的是不带"stable"的函数排序,那么排序完 后,"winter"有可能在"apples"的前面。

举例说明:

#include <vector>
#include <iostream>
#include <algorithm>
 
using namespace std;
 
bool comp_as_int(double i, double j)
{
	return (int(i)<int(j));
}
 
int main()
{
	double mydoubles[] = { 3.14, 1.41, 2.72, 4.67, 1.73, 1.32, 1.62, 2.58 };
	vector<double> v;
	vector<double>::iterator it;
 
	v.assign(mydoubles, mydoubles + 8);
 
	cout << "use default comparison:" << endl;
	stable_sort(v.begin(), v.end());
 
	for (it = v.begin(); it != v.end(); it++)
		cout << *it << " ";
	cout << endl;
 
	cout << "use selfdefined comparison function comp_as_int():" << endl;
	v.assign(mydoubles, mydoubles + 8);
	//stable sort 是稳定排序。
	stable_sort(v.begin(), v.end(), comp_as_int);
 
	for (it = v.begin(); it != v.end(); it++)
		cout << *it << " ";
	cout << endl;
	
	cout << "use comparison function comp_as_int():" << endl;
	v.assign(mydoubles, mydoubles + 8);
	//sort是不稳定排序。
	sort(v.begin(), v.end(), comp_as_int);
 
	for (it = v.begin(); it != v.end(); it++)
		cout << *it << " ";
	cout << endl;
 
	cout << "if it is not sorted with stable_sort(), the sequence of all elements between 1 and 2 will be set randomly..." << endl;
 
 
	int n;
	cin >> n;
	return 0;
}
 
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

发狂的蜗牛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值