[5 算法] 31. 了解各种排序选择(partition,stable_partition,nth_element,partial_sort,sort,stable_sort)

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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值