• Effective_STL 学习笔记(三十一) 了解你的排序选择


    排序出 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

  • 相关阅读:
    springboot ueditor 使用心得
    利用github和git命令,将本地项目共享到服务器上——第二章
    利用github和git命令,将本地项目共享到服务器上
    如何打造亚秒级加载的网页3——用户体验 总结
    如何打造亚秒级加载的网页2——网络性能 过程解读
    如何打造亚秒级加载的网页1——前端性能
    什么是跨域?怎么解决跨域?
    Vue生命周期
    利用JS实现vue中的双向绑定
    按照vue文档使用JavaScript钩子但是却不能执行动画?
  • 原文地址:https://www.cnblogs.com/kidycharon/p/10038523.html
Copyright © 2020-2023  润新知