全排列的递归算法(包括字典序输出和非字典序输出)

第一种:(字典序)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int a[10],p[10],vis[10];//标记为1则说明已固定
int n;
void digui(int l){
    int i;
    if(l>n){
        for(i=1;i<n;i++){
            printf("%d ",p[i]);
        }
        printf("%d\n",p[n]);
    }
    for(i=1;i<=n;i++){
        if(!vis[a[i]]){
            p[l]=a[i];
            vis[a[i]]=1;
            digui(l+1);
            vis[a[i]]=0;
        }
    }
}
int main()
{
    int i;
    scanf("%d",&n);
    for(i=1;i<=n;i++){
        a[i]=i;
    }
    memset(vis,0,sizeof(vis));
    digui(1);
    return 0;
}

第二种:(非字典序)

#include <stdio.h>
#include <stdlib.h>
int n=0;
void swap(int *a,int *b)
{
    int m;
    m=*a;
    *a=*b;
    *b=m;
}
void all_pailie(int a[],int k,int m)
{
    int i;
    if(k>m)
    {
        for(i=0; i<=m; i++)
        {
            printf("%d ",a[i]);
        }
        printf("\n");
        n++;
    }
    else
    {
        for(i=k; i<=m; i++)
        {
            swap(&a[k],&a[i]);
            all_pailie(a,k+1,m);
            swap(&a[k],&a[i]);
        }
    }
}
int main()
{
    int a[]= {1,2,3,4,5};
    all_pailie(a,0,4);

    return 0;
}

    原文作者:递归算法
    原文地址: https://blog.csdn.net/xdz78/article/details/45769855
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞