next_permutation(全排列算法)

Posted fengzhongzhuifeng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了next_permutation(全排列算法)相关的知识,希望对你有一定的参考价值。

https://blog.csdn.net/c18219227162/article/details/50301513

#include<iostream>
#include<algorithm>
using namespace std;
int main()

    int ans[4]=1,2,3,4;
    sort(ans,ans+4);    /* 这个sort可以不用,因为1,2,3,4已经排好序*/
    do                             /*注意这步,如果是while循环,则需要提前输出*/
    
        for(int i=0;i<4;++i)
            cout<<ans[i]<<" ";
        cout<<endl;
    while(next_permutation(ans,ans+4));
    return 0;

拓展
1.能否直接算出集合1, 2, ..., m的第n个排列?

举例说明:如7个数的集合为1, 2, 3, 4, 5, 6, 7,要求出第n=1654个排列。

(1654 / 6!)取整得2,确定第1位为3(从0开始计数),剩下的6个数1, 2, 4, 5, 6, 7,求第1654 % 6!=214个序列;

(214 / 5!)取整得1,确定第2位为2,剩下5个数1, 4, 5, 6, 7,求第214 % 5!=94个序列;

(94 / 4!)取整得3,确定第3位为6,剩下4个数1, 4, 5, 7,求第94 % 4!=22个序列;

(22 / 3!)取整得3,确定第4位为7,剩下3个数1, 4, 5,求第22 % 3!=4个序列;

(4 / 2!)得2,确定第5为5,剩下2个数1, 4;由于4 % 2!=0,故第6位和第7位为增序<1 4>;

因此所有排列为:3267514。

#include<iostream>
#include<algorithm>
using namespace std;
int main()

    int ans[7]=1,2,3,4,5,6,7;
    sort(ans,ans+7);  /* 同上可以不用sort */
    int n=0; 
    do                             //注意这步,如果是while循环,则需要提前输出
    
        if(n == 1654)
        
             for(int i=0;i<7;++i)
            cout<<ans[i];
            cout<<endl;
            break;
        
        n++;
     while(next_permutation(ans,ans+7));
    return 0;

2. 给定一种排列,如何算出这是第几个排列呢?

和前一个问题的推导过程相反。例如3267514:

后6位的全排列为6!,3为1, 2, 3 ,4 , 5, 6, 7中第2个元素(从0开始计数),故2*720=1440;

后5位的全排列为5!,2为1, 2, 4, 5, 6, 7中第1个元素,故1*5!=120;

后4位的全排列为4!,6为1, 4, 5, 6, 7中第3个元素,故3*4!=72;

后3位的全排列为3!,7为1, 4, 5, 7中第3个元素,故3*3!=18;

后2位的全排列为2!,5为1, 4, 5中第2个元素,故2*2!=4;

最后2位为增序,因此计数0,求和得:1440+120+72+18+4=1654


这个的代码实现,可以用一个数组a保存3267514,然后while调用next_permutation(),用n计数,每次与数组a比较,相等则输出n;

以上是关于next_permutation(全排列算法)的主要内容,如果未能解决你的问题,请参考以下文章

next_permutation(全排列算法)

[算法]——全排列(Permutation)以及next_permutation

next_permutation(全排列算法)

next_permutation(全排列算法)

下一个排列问题next_permutation

全排列 next_permutation() 函数的用法