文章转载自:http://www.cnblogs.com/ffhajbq/archive/2012/07/24/2607476.html
http://blog.csdn.net/godenlove007/article/details/7982450
关于stable_sort()和sort()的区别:
你发现有sort和stable_sort,还有 partition 和stable_partition, 感到奇怪吧。其中的区别是,带有stable的函数可保证相等元素的原本相对次序在排序后保持不变。或许你会问,既然相等,你还管他相对位置呢,也分不清 楚谁是谁了?这里需要弄清楚一个问题,这里的相等,是指你提供的函数表示两个元素相等,并不一定是一摸一样的元素。
例如,如果你写一个比较函数:
bool less_len(const string &str1, const string &str2) { return str1.length() < str2.length(); }
此时,"apple" 和 "winter" 就是相等的,如果在"apple" 出现在"winter"前面,用带stable的函数排序后,他们的次序一定不变,如果你使用的是不带"stable"的函数排序,那么排序完 后,"Winter"有可能在"apple"的前面。
举例说明:
- #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(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;
- return 0;
- }
输出结果:
1 use default comparison: 2 1.32 1.41 1.62 1.73 2.58 2.72 3.14 4.67 3 use selfdefined comparison function comp_as_int(): 4 1.41 1.73 1.32 1.62 2.72 2.58 3.14 4.67 5 if it is not sorted with stable_sort(), the sequence of all elements between 1 and 2 will be set randomly...
这两个函数的原理都是快速排序,时间复杂度在所有排序中最低,为O(nlog2n) ; http://blog.sina.com.cn/s/blog_933dc4350100y9yk.html
sort的应用;
1、可以传入两个参数;
2、传入三个参数;
而stable_sort的用法与sort一致,区别是stable_sort函数遇到两个数相等时,不对其交换顺序;这个应用在数组里面不受影响,当函数参数传入的是结构体时,会发现两者之间的明显区别;