【概述】

首先要了解什么是 “下一个” 排列组合,什么是 “上一个” 排列组合。

假设有三个数字组成的序列:{a,b,c}

则这个序列有6种可能的排列组合:abc、acb、bac、bca、cab、cba

上述的排列组合是根据 less-than 操作符做字典顺序的排序,即:abc 处于第一,每一个元素都小于其后的元素,而 acb 是次一个排列组合,它是固定了序列内最小元素( a )之后所做的新组合。

同理,序列中次小元素( b )而做的排列组合,在次序上将先于那些固定最小元素( c )而做的排列组合,以 bac、bca 为例,bac 在 bca 之前,因为次序 ac 小于序列 ca ,因此,对于 bca,可以说其前一个排列组合是 bac,其后一个排列组合是 cab。

要注意的是,处于排列首的序列 abc 没有 “前一个” 排列组合,处于排列尾的序列 cba 没有“后一个”排列组合。

【STL 中提供的算法】

STL 提供了两个用来计算排列组合关系的算法,分别是 next_permutation() 与 prev_permutation()

其中,next_permutation() 是取出当前范围内的排列,并重新排序为下一个排列,prev_permutation() 是取出指定范围内的序列并将它重新排序为上一个序列。如果不存在下一个序列或上一个序列则返回 false,否则返回 true

这个算法有两个版本,其一使用元素类别所提供的操作符来决定下一个或上一个排列组合,其二是以仿函数 comp 来决定

1.算法思想

以 next_permutation() 为例:

  1. 从最尾端开始向前寻找两个相邻的元素,令第一元素为 *i,第二元素为 *ii,且满足 *i<*ii
  2. 找到上述的一组相邻元素后,从最尾端向前检验,找出第一个大于 *i 的元素,令其为 *j,然后将 i、j 元素交换
  3. 再将 ii 之后的所有元素颠倒排序

假设存在序列{0,1,2,3,4},下图即为寻找全排列的过程

2.next_permutation() 的用法

对于给定的任意一种排列组合,如果能求出下一个排列的情况,那么求得所有全排列情况就容易了。

利用 next_permutation() 的返回值,通过判断排列是否结束,即可求出全排列。

int a[N];
void all_permutation(int n)
{sort(a,a+n);do{for(int i=0; i<n; i++)printf("%d ",a[i]);printf("\n");}while(next_permutation(a,a+n));
}

3.next_permutation() 与 prev_permutation() 的区别

next_permutation() 函数默认的是从小到大的顺序,而 prev_permutation() 函数默认的是从大到小的顺序。

例如:对于序列 {3,1,2}

用 next_permutation() 函数得到的结果是:312、321

用 prev_permutation() 函数得到的结果是:312、231、213、132、123

C++语言基础 —— STL —— 算法 —— 排列组合算法相关推荐

  1. c语言排列组合的函数,c语言排列组合算法 排列和组合算法的实现方法_C语言经典案例...

    想了解排列和组合算法的实现方法_C语言经典案例的相关内容吗,在本文为您仔细讲解c语言排列组合算法的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:c语言排列组合算法,下面大家一起来学习吧. ...

  2. python 排列组合速度_Python实现的简单排列组合算法示例

    本文实例讲述了Python实现的简单排列组合算法.分享给大家供大家参考,具体如下: 1.python语言简单.方便,其内部可以快速实现排列组合算法,下面做简单介绍 2.一个列表数据任意组合 主要是利用 ...

  3. python写排列组合_Python实现的简单排列组合算法示例

    本文实例讲述了Python实现的简单排列组合算法.分享给大家供大家参考,具体如下: 1.python语言简单.方便,其内部可以快速实现排列组合算法,下面做简单介绍 2.一个列表数据任意组合 主要是利用 ...

  4. python 排列组合算法_基于python快速实现排列组合算法

    1.python语言简单.方便,其内部可以快速实现排列组合算法,下面做简单介绍. 2.一个列表数据任意组合 2.1主要是利用自带的库#_*_ coding:utf-8 _*_ #__author__= ...

  5. 排列组合算法之二: 01转换法_java改变后的c++改进版

    http://blog.csdn.net/canguanxihu/article/details/46363375 排列组合算法之一: 01转换法_java改变后的c++版 class ZuheAss ...

  6. 排列 组合 算法(一)

    排列组合算法 我们都知道排列与组合的个数可以利用公式很容易的求出来,但是要是把这些排列组合的序列一一输出怎么办呢? 下面结合<组合数学>(第四版)卢开澄卢华明编著,好好总结排列与组合的算法 ...

  7. java 获取排列组合_Java获得一个数组的指定长度排列组合算法示例

    本文实例讲述了Java获得一个数组的指定长度排列组合算法.分享给大家供大家参考,具体如下: package demo; import java.util.Stack; /** * JAVA获得一个数组 ...

  8. js排列组合算法解决方案

    之前文章中谈过排列组合算法,主要事递归,代码如下 const arrangeCombination = arr => {const res = [], len = arr.length, inn ...

  9. C#语法灵活运用之排列组合算法

    今天群里有朋友求一个排列组合算法,题目是给定长度,输出所有指定字母的组合. 如指定字母a.b.c.d.e.f,长度为2,则结果应为:aa.ab.ac ... ef.ff. 有朋友给出算法,很有特色: ...

最新文章

  1. Chrome浏览器禁止缓存
  2. 学python用什么软件开发-5款Python程序员高频使用开发工具推荐
  3. 【九度OJ】题目1078-二叉树遍历
  4. Spring Cloud中,Eureka常见问题总结
  5. no acceptable C compiler found in $PATH
  6. Shell(bash) 介绍
  7. LeetCode篇之链表:1290(二进制链表转整数)
  8. javascript encodeURI和encodeURIComponent的比较
  9. jeval 公式_几款公式解析工具的比较
  10. python姿态识别_基于深度学习的人体姿态识别算法总结
  11. 南宁:“数字城管”让智慧城市建设提质提速
  12. 零基础学SQL(一、数据库与SQL简介)
  13. 对抗神经网络学习(简单的理解)
  14. 非常适合新手入门学习的三款建模软件
  15. thinkpad T480安装WIN7系统NVM固态硬盘+INTEL HD620显卡
  16. web开发路径问题解决
  17. Lake Shore—224 型温度监测器
  18. QtreeWidget添加右键菜单
  19. Spring Cloud Hystrix 全解 (1) - 总览篇
  20. **京东撸货是什么,京东撸货具体怎么玩,能不能赚钱,我来告诉你**

热门文章

  1. 只有22%的人做对了这道数据分析题,你来试试吗?
  2. 支付宝用大数据憋死伪基站骗子
  3. CANOpen紧急报文
  4. mysql置信度支持度,关于支持度和置信度的说明
  5. UUID 正在被 NanoID 取代?
  6. 求职和跳槽最好的月份要来了吗
  7. 加速你的IDE !!!送9个固态硬盘(金士顿240G SSD)
  8. 漫画:凌晨2点,老板在工作群@了我...
  9. 代码重构技巧宝典,学透本篇就足够了!
  10. CTO怒了:再写if-else,逮着罚款1000!