全排列方法

Step1:

​ 首先保证队列的一开始为有序递增的,使用sort按照从小到大的顺序进行排列。

Step2:

​ 接着我们开始寻找对应当前序列的下一个字典序序列。

首先从队列的最右端开始寻找,第一个自己小于右边数的元素中的位置。并记录下当前的这个位置

从上一步骤中记录的位置开始,向右寻找比当前这个位置的数大的最小的元素

从找到的位置下一个地方开始将剩下的数组进行转置,我们就可以得到下一个字典序序列

下面开始代码实现

#include <stdio.h>
const int maxn=1005;
int num[maxn]={0};
int n;
bool work()
{
    bool find=false;//作为判断标志
    int tar;
    for(int i=n-1;i>=1;i--)//从右边开始寻找第一个比右侧元素小的位置
    {
        if(num[i]<num[i+1])
        {
            tar=i;
            find=true;
            break;
        }
    }
    if(!find)//没有找到,即代表当前已经满足条件
    {
        return false;
    }
    int min=9999999;
    int pos2=1;
    for(int i=tar+1;i<=n;i++)//寻找比num[pos1]要大的最小的元素的位置
    {
        if(num[i]>num[tar])
        {
            min=min<num[i]?min:num[i];
            pos2=i;
        }
    }
    int t=num[pos2];
    num[pos2]=num[tar];
    num[tar]=t;
    int i=tar+1;
    int j=n;
    for(;i<j;i++,j--)//将num[pos1]之后的数组进行转置
    {
        int t=num[i];
        num[i]=num[j];
        num[j]=t;
    }
    return true;
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        num[i]=i;
    }
    for(int i=1;i<=n;i++)
    {
        printf("%d",num[i]);
    }
    puts("");
    while(work())//循环寻找,直到找不到
    {
        for(int i=1;i<=n;i++)
        {
            printf("%d",num[i]);
        }
        puts("");    
    }
    return 0;
}