sort
//版本一 template <class RandomAccessIterator> void sort(RandomAccessIterator first,RandomAccessIterator last); //版本二 template <class RandomAccessIterator,class StrictWeakOrdering) void sort(RandomAccessIterator first,RandomAccessIterator last,StrictWeakOrdering cmp);
stable_sort
//版本一 template <class RandomAccessIterator> void stable_sort(RandomAccessIterator first,RandomAccessIterator last); //版本二 template <class RandomAccessIterator,class StrictWeakOrdering) void stable_sort(RandomAccessIterator first,RandomAccessIterator last,StrictWeakOrdering cmp);
- stable_sort会保证排序后元素的相对位置不变(把某序列按姓排序,如果姓相同而名不同,则视为等价,此时相对位置不改变,用stable_sort函数),使用merge sort算法
- sort不会保证排序后的相对位置相同,因此sort比stable_sort快,使用intersort算法
- 每个函数都有两个版本,第一个版本重载operator < ,第二个版本调用自己定义的function object
#include <iostream> #include <vector> #include <algorithm> using namespace std; class F { public: bool operator()(int i,int j) { return (i%10)>=(j%10); } }; int main() { vector<int> v{2,1,-1,5,6,3}; sort(v.begin(),v.end(),F()); for_each(v.begin(),v.end(),[](int i) { cout<<i<<" "; }); cout<<endl; return 0; }
parital_sort
//版本一,使用operator <来比较,都是先取元素后排序 template <class RandomAccessIterator> void partial_sort(RandomAccessIterator first,RandomAccessIterator middle,RandomAccessIterator last); //版本二 ,用自定义的function object来比较 template <class RandomAccessIterator,class StrictWeakOdering> void partial_sort(RandomAccessIterator first,RandomAccessIterator middle,RandomAccessIterator last,StrictWeakOdering cmp);
- 使[first,middle)中个最小元素以递增方式排序,[middle,last)中无序,但[middle,last)中的每个元素都大于[first,middle)中的元素
- 用partial_sort而不用sort的理由是partial_sort挑选出来n个元素来排序比对整个区间来排序要快
- middle==first,无意义,先将0个元素放入[first,first)中,然后将剩余元素也即是所有元素放入[first,last)中,唯一保证是[first,last)中的元素以未知顺序排序过
- middle==last,是对整个区间排序
partial_copy_sort
//版本一 template <class RandomAccessIterator> void partial_sort_copy(RandomAccessIterator first,RandomAccessIterator last,RandomAccessIterator result_first,RandomAccessIterator result_last); //版本二 template <class RandomAccessIterator,class StrictWeakOdering> void partial_sort_copy(RandomAccessIterator first,RandomAccessIterator last,RandomAccessIterator result_first,RandomAccessIterator result_last,StrictWeakOdering cmp);
与partial_sort基本类似,复制[firstlast)中n个最小的元素到[result_first,result_first+n)中,n为[first,last)和[result_first,result_last)中的最小值,然后在进行排序。
不能copy到标准输出设备,result为RandomAccessIterator
nth_element
template <class RandomAccessIterator> void nth_element(RandomAccessIterator first,RandomAccessIterator middle,RandomAccessIterator last); template <class RandomAccessIterator,class StrickWeakOrdering> void nth_element(RandomAccessIterator first,RandomAccessIterator middle,RandomAccessIterator last,StrickWeakOrdering cmp);
这里唯一的保证是数组被分为两段,第一段内的任何元素都不大于第二段,而每段中的内部排序并非重点
is_sorted
//版本一:调用operator < template <class ForwardIterator> bool is_sorted(ForwardIterator first,ForwardIterator last); //版本二:调用自己定义的function object template <class ForwardIterator,class StrictWeakOrdering> bool is_sorted(ForwardIterator first,ForwardIterator last,StrictWeakOrdering cmp);
两个版本都不操作range,只是测试range是否已经排过序,若first==last,两个版本都返回true
#include <iostream> #include <vector> #include <algorithm> #include <typeinfo> #include <list> using namespace std; int main() { vector<int> v{1,2,3,4,6,5}; cout<<is_sorted(v.begin(),v.end())<<endl; /*typedef typename iterator_traits<list<int>::iterator>::iterator_category ic; cout<<typeid(ic).name()<<endl;*/ cout<<is_sorted(v.begin(),v.begin())<<endl; return 0; }