1 完全排序sort
排序首先想到的是sort,但它并非在任何场合都是完美的,因为有时你不需要一个完全的排序。
2 部分排序partial_sort
如果你有一个存放Widget的vector,你需要将质量最好的20个Widget送给最重要的客户,那么只需排序出前20个Widget,其他的Widget可以不排序。
bool qualityCompare(const Widget& lhs, const Widget& rhs)
{
// 返回lhs的质量是否好于rhs的质量的结果
}
// 将质量最好的20个元素顺序放在widgets的前20个位置上
partial_sort(widgets.begin(), widgets.begin()+20,widgets.end(), quailtyCompare);
3 nth_element
如果只需要找到最好的20个Widget,这20个Widget可以以任意顺序排列。nth_element用于排序一个区间,它使得位置n上的元素正好是全排序情况下的第n个元素。
来看下如何使用nth_element来保证最好的20个Widget被放到vector的前面:
// 将最好的20个元素放在widgets的前部,但并不关心它们的具体排列顺序
nth_element(widgets.begin(),
widgtes.begin() + 19,
widgets.end(),
qualityCompare);
partial_sort对位置1~20中的元素进行了排序,而nth_element没有对它们进行排序。
nth_element除了可以找到排名在前的n个元素外,还可以用来找到一个区间的中间值,或者找到某个特定百分比上的值:
vector<Widget>::iterator begin(widgets.begin());
vector<Widget>::iterator end(widgets.end());
// 感兴趣的元素
vector<Widget>::iterator goalPosition = begin + widgets.size() / 2;
// 找出具有中间质量级别的Widget
nth_element(begin, goalPosition, end, qualityCompare);
vector<Widget>::size_type goalOffset = 0.25 * widgets.size();
// nth_element质量由高到低"全排序"
// 找到75%质量的元素
nth_element(begin, begin + goalOffset, end, qualityCompare);
4 stable_sort
partial_sort、nth_element和sort都属于非稳定的排序算法。
stable_sort是与sort功能相同的稳定的排序算法。STL中没有与partial_sort和nth_element功能相同的稳定的排序算法。
5 patition
假如所需要的不是质量最好的20个Widget,而是所有的一级品和二级品。
partition算法可以把所有满足某个特定条件的元素放在区间的前面。首先定义一个函数来标志出那些Widget满足要求:
bool hasAcceptableQuality(const Widget& w)
{
}
// 将满足hasAcceptableQuality的所有元素移动到前面,返回一个迭代器指向第一个不满足条件的Widget
vector<Widget>::iterator goodEnd =
partition(widgets.begin(), widgets.end(), hasAcceptableQuality);
对应的稳定排序是stable_patition。
总结:
1 sort、stable_sort、partial_sort和nth_element等算法都要求随机访问迭代器,所以这些算法只适用于vector、string、deque和数组。
2 partition和stable_pattition只需要双向迭代器,所以适用于所有标准序列容器。
3 对vector、string、deque和数组中的元素完全排序,可以使用sort或stable_sort。
4 对vector、string、deque和数组中的元素,对最前面的n个元素进行排序,可以使用partial_sort。
5 对vector、string、deque和数组中的元素,需要找到第n个位置上的元素,或者需要找到最前面的n个元素但不必对这n个元素进行排序,可以使用nth_element。
6 对标准序列容器的元素按照是否满足某个条件区分开,可以使用partition和stable_partition。
7 对于list,可以使用partition和stable_partition;不可以使用sort和stable_sort,替代方案是使用list::sort。