这两个库函数通常用于生成序列的全排列。
next_permutation
如果当前排列已经达到最大字典序,比如下图中的4321,则函数返回false;
该函数第一个参数是区间的首地址,第二个参数为区间的尾地址的下一个地址,前闭后开。这样子的话,可以对指点区间进行全排列。
code:
结合sort使用:
但是如果给定数组的字典序是乱的,直接用的话就不能得到完整的全排列。
code:
所以要先给数组排序,确保数组为升序,通常要结合sort一起用。
code:
算法思路:
该函数所利用的算法思路:从最右边开始,两两比较相邻的元素,直到找到右边比左边大的一对,左边那个就是将要被替换的,再从最右边开始找比这个元素大的第一个,交换他们两个;
交换之后,翻转交换元素的后面的所有元素;
例如:1 3 4 6 5 2=>1 3 5 6 4 2=>1 3 5 2 4 6
dfs的等效替代:
通常我们也可以利用dfs(深度优先搜索)的方式写列出全排列来达到同等的效果。
code:
prev_permutation
prev_permutation跟next_permutation相反,由原排列得到字典序中上一个最近排列。当调用排列已经到达最小字典序,则函数返回false;
结合sort使用:
如果给定的数组不是按降序排列,如果直接用prev_permutation的话,那么就会漏掉一些情况。
code:
如果数组字典序不是降序,那么就要先对数组进行排序,通常也是用sort;
code:
其他的跟next_permutation相反,就不一一描述了。