排序出 20 个质量最高的 Widget,一种算法叫作 partial_sort:
1 bool qualityCompare( const Widget & lhs, const Widget & rhs ) 2 { 3 // 返回 lhs 的质量是不是比 rhs 的质量好 4 } 5 . . . 6 partial_sort( widget.begin(), widget.begin() + 20, widget.end(), qualityCompare ); 7 // 把最好的 20 个元素(按顺序)放在 widget 的前端
选出任意 20 个质量最好的 widget(不排序),使用算法 nth_element:
1 nth_element( widgets.begin(), widgets.begin() + 19, widgets.end(), qualityCompare ); 2 // 把最好的 20 个元素放在 widget 前端,不排序
选出前两个最好等级的元素,使用算法 partition:
1 bool hasAcceptableQuality( const Widget & w ) 2 { 3 // 返回 w 质量等级是否是 2 或更高 4 } 5 vector<Widget>::iterator goodEnd = 6 partiation( widgets.begin(), widgets.end(), hasAccetableQuality ); 7 // 把所有满足hasAccetableQuality 的widgets移动到 widgets 前端
完成后,widgets.begin() 到goodEnd的区间容纳了质量是 1 或 2 的 Widget稳定的算法是 stable_partition
算法 sort、stable_sort、partial_sort 和 nth_element 需要随机访问迭代器,
所以只能用于 vector、string、deque 和数组,对于标准关联容器无意义。
list::sort 提供了稳定排序,可以间接进行 list 元素 partial_sort 或 nth_element
partition 和 stable_partition 与 sort、stable_sort、partial_sort 和 nth_element 不同,
只需双向迭代器,因此可以在任何标准序列迭代器上使用 partition 和 stable_parttion
总结排序选择:
1. 需要在 vector、string、deque 或数组上进行完全排序,可以使用 sort 或 stable_sort
2. 对于 vector、string、deque 或数组,只需要排序前 n 个元素,使用 partial_sort
3. 对于 vector、string、deque 或数组,只需选出前 n 个元素(不排序),使用 nth_element
4. 如果需要把标准序列容器的元素或数组分隔为满足和不满足某个标准,则需要 partition 或 stable_partition
5. 如果数据是在 list 中,可以直接使用的是 partition 和 stable_partition,
可以使用 list 的 sort 来代替算法 sort 或 stable_sort,
如果需要 partial_sort 或 nth_element 提供的效果,需要间接完成
另外,可以把数据放在标准关联容器中来保持数据有序,可以考虑标准非 STL 容器 priority_queue,它也可以总是保持数据有序,priority_queue 不在 STL 是因为没有迭代器
算法排序(时间和空间):
1. partition
2. stable_partition
3. nth_element
4. partial_sort
5. sort
6. stable_sort