这里是使用迭代器(iterator),并且是随机访问迭代器(RandomAccessIterator)。
比较函数
在介绍具体的算法之前,先要了解一下STL排序算法中的比较函数。
为了使STL排序算法按照你的规则排序,你需要给它指定一个比较函数。如果没有指定,编译器会自行指定为less仿函数。如下:
vector<int> vect;
sort(vect.begin(), vect.end());
此时相当于调用:
sort(vect.begin(), vect.end(), less<int>());
STL还提供了其他仿函数,如下:
equal_to
not_equal_to
less
greater
less_equal
greater_equal
当容器中的元素是一些标准类型(int、float、char或string等)时,可以直接使用这些仿函数。但如果容器中的元素是自定义类型或者你需要按照其他的规则排序时,就还需要进行一些额外的处理,有两种方法:
1.自己写比较函数,例如:
bool my_less(const MyClass& c1, const MyClass& c2)
{
return c1.val < c2.val;
}
2.在自定义类型中重载“<”或“>”之类的操作符,例如:
bool operator <(const MyClass& c)
{
return val < c.val;
}
稳定排序
在排序算法中,带有stable字样的,即为稳定排序,意思就是可以保证相等元素的前后位置在排序前后保持不变。
sort和stable_sort
参数:first, last, comp
功能:对[first, last]区间内的元素按照comp规则进行全排序。
comp为比较函数,可选,若未指定,默认为less。
sort采用的是成熟的快速排序,目前大部分TL版本已经不是采用简单的快速排序,而是结合内插排序算法。时间复杂度为n*log(n)。
stable_sort采用的是归并排序,分配足够的内存时,其时间复杂度为n*log(n),否则为n*log(n)*log(n)。
partial_sort
参数:first, middle, last, comp
功能:在[first, last]区间中,找出符合comp规则的前middle-first+1个元素,排序后放在[first, middle]区间。举例说明就是,100个学生中,找出分数最低的5个人并排好序。
partial_sort采用的是堆排序,任何情况下的时间复杂度都是n*log(n)。
如果希望用partial_sort来实现全排序,只要让middle=last就可以了。
partial_sort_copy其实是partial_sort和copy的组合。
使用示例:
partial_sort(vect.begin(), vect.begin()+5, vect.end(), less());
nth_element
参数:first, nth, last, comp
功能:在[first, last]区间中,找出按照comp规则排序出现在第nth个位置的元素。
该函数只是确保按照comp规则排序后应该出现在第nth个位置的元素出现在该位置,但不保证其他元素的有序性,所以其他元素很可能是杂乱无章的。
使用示例:
nth_element(vect.begin(), vect.begin()+3, vect.end(), less());
partition和stable_partition
参数:first, last, pred
功能:将[first, last]区间中符合pred约束的元素放到前面。
实际上,这两个函数称之为归类函数更为准确。
使用示例:
student exam("pass", 60);
stable_partition(vect.begin(), vect.end(), bind2nd(less(), exam));