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。

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

  1. 数据结构与算法笔记(七)—— 选择排序

    什么是选择排序 选择排序(Selection sort)是一种简单直观的排序算法. 算法步骤:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大 ...

  2. JavaScript 几种排序算法实现(冒泡、选择、插入、归并、快速排序)

    1. 冒泡 // 冒泡 - 每次循环, 将两两中偏大的元素移动到右边 for (let i = 0; i < arr.length - 1; i++) {for (let j = i; j &l ...

  3. C语言——十四种内部排序算法【直接插入排序-冒泡排序-选择排序-插入排序-希尔排序-归并排序-快速排序-堆排序-折半插入排序-二分查找-路插入排序-表插入排序-简单选择排序-直接选择排序-树形选择】

    目录: 一:插入排序 A:直接插入排序 1.定义: 2.算法演示 实例1: 3.基本思想 4.排序流程图 实例1: B:希尔排序 1.定义: 2.算法演示 实例2: C:其他插入排序 a:折半插入排序 ...

  4. 【Java】5大排序算法总结(插入排序+希尔排序+选择排序+堆排序+冒泡排序)

    快速导航: 1. 稳定性 2 . 插入排序 3. 希尔排序 4. 选择排序 5. 堆排序 6 冒泡排序 1. 稳定性 两个相等的数据,如果经过排序后,排序算法能保证其相对位置不发生变化,则我们称该算法 ...

  5. 疯子的算法总结(六) 简单排序总 选择排序+插入排序+比较排序+冒泡排序

    一.数组的排序算法 1.选择排序 选择排序是指每次选择所需排序数组中的最大值或者最小值(根据排序方式选择,从大到小选最大,从小到大选最小),将这个元素与前面没有进行排序的元素交换. 下面以1 4 2 ...

  6. 选择排序算法流程图_常用排序算法之选择排序

    前两天给大家分享了冒泡排序和插入排序(没关注的同学,可以关注后查看历史消息),今天继续给大家分享另一种常用的排序算法--选择排序. 选择排序 选择排序和插入排序很相似,也区分已排序区间和未排序区间,选 ...

  7. python 按条件选择行和列数据_小白学数据结构-排序算法Python(冒泡、选择、快速、希尔等等)...

    排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 我们通常所说的排序算法往往指的是内部排序算法,即数据 ...

  8. 《数据结构与算法》实验:排序算法实验比较——选择排序 堆排序

    <数据结构与算法>实验和课程Github资源 <数据结构与算法>实验:线性结构及其应用--算术表达式求值 <数据结构与算法>实验:树型结构的建立与遍历 <数据 ...

  9. 【排序算法】冒泡排序、简单选择排序、直接插入排序比较和分析

    [排序算法]冒泡排序.简单选择排序.直接插入排序比较和分析 写在前面: 本文简单介绍了冒泡排序.简单选择排序.直接插入排序,并对这三种排序进行比较,入参都是80000个随机数,比较算法耗时.进一步,我 ...

最新文章

  1. struts2 开发
  2. php try 中 抛出异常处理,php中try catch捕获异常实例详解
  3. 以不同的维度去看待问题
  4. 几天后自动领取java怎么做的_java获取几天前和几天后的日期
  5. python观察日志(part15)--命名元祖namedtuple
  6. 如何把Kubernetes config view里的base64编码过后的secret信息还原
  7. zookeeper linux 环境变量,zookeeper linux版安装
  8. Python网络编程之TCP通信实例和socketserver框架使用例子
  9. oracle重建索引对空间的使用,分析oracle索引空间使用情况,以及索引是否需要重建...
  10. 【a701】旅行家的预算
  11. 杨辉三角c语言if 编程,杨辉三角_用c语言怎么编程
  12. 微型计算机控制程序题,微机控制技术》习题集
  13. 又一个微信聊天机器人横空出世了,人人可用
  14. 常见必问面试问题一_面试自我介绍3分钟、离职原因、期望薪资…(含面试技巧和答案)
  15. POJ3295 Tautology
  16. c语言编写坦克大战设计报告,c语言编写坦克大战源代码
  17. CVE-2018-1273漏洞复现日志+IDS规则编写
  18. linux setlocale函数,linux中的多语言环境(LC_ALL, LANG, locale)
  19. 多目标优化(一)简单的 NSGA-Ⅱ
  20. OpenCL专题04:ViennaCL与Eigen双剑合璧

热门文章

  1. IP(Internet Protocol)网际协议
  2. 牛客编程巅峰赛S1第3场 - 黄金钻石 A.简单题 B.dfs C.并查集
  3. python删除最后一个元素_Numpy-从一维数组中删除最后一个元素的最佳方法?
  4. Redis学习笔记(附面试题)
  5. 沙箱验证签名失败和沙箱验证签名生成失败
  6. dya6小数据池、集合、编码、深浅copy
  7. Find X3系列能实现OPPO的高端破局之梦吗?
  8. NavicatforMySQL_繁星漫天_新浪博客
  9. PMBOK 第六版 识别风险:工具与技术——提示清单
  10. OWASP TOP 10-2021年十大Web应用安全风险榜单