全排列

作者: 董玉恒_算法训练营 | 来源:发表于2019-03-06 10:29 被阅读0次

现在给定n(n>=1)个元素组成的集合,输出该集合所有可能的排列,例如:集合{a,b,c}的所有可能排列{(a,b,c),(a,c,b),(b,a,c),(b,c,a),(c,a,b),(c,b,a)}求给定字符串的所有排列。

和上文相同,首先我们要考虑使用递归的两个条件:

第一:这个问题是否可以分解为形式相同但规模更小的问题?

第二:如果存在这样一种分解,那么这种分解是否存在一种简单情境?

第一点,是否存在一种符合条件的分解。分析发现,若有集合{a,b,c,d},全排列问题可由下列排列组成:

1)以a开头后面跟着(b,c,d)的所有排列;

2)以b开头后面跟着(a,c,d)的所有排列;

3)以c开头后面跟着(a,b,d)的所有排列;

4)以d开头后面跟着(a,b,c)的所有排列;

所以将问题分解为小问题的线索就是“后面跟着。。。。的所有排列”,也就是说,如果能够解决n-1个元素集合的排列问题,就可以解决n个元素集合的排列问题。

第二点,一种简单的情景。最简单的情景就是将所有字符顺序输出。

代码如下:(以下代码是对数字进行全排列,若要对字符进行全排列,改动类型就好)

#include<cstdio>

void swap(int* a,int* b){

int temp=*a;

*a=*b;

*b=temp;}

void perm(int *a,int i,int n){

    int j;

    if(i==n){

        for(j=0;j<=n;j++)

        printf("%d",a[j]);

        printf(" ");}

    else{

        for(j=i;j<=n;j++){

        swap(&a[i],&a[j]);

        perm(a,i+1,n);

        swap(&a[i],&a[j]);}

}

    }

int main(){

int a[]={1,2,3,4};

perm(a,0,3);

return 0;}

相关文章

  • 全排列与字典序

    全排列 递归实现全排列; 首先来说递归算法实现全排列: 例如,对于{1,2,3,4}的例子进行全排列,其可以分解...

  • 全排列

    求全排列最简单的就是递归了123 的全排列共有 6 个, 123 的全排列等于以 1 开头 23 的全排列, 加上...

  • 全排列

    题目 输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排...

  • 全排列

    递归的版本image.png

  • 全排列

  • 全排列

  • 全排列

    给出一个列表[1,2,3],其全排列为: [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,...

  • 全排列

    给定一个数字列表,返回其所有可能的排列。

  • 全排列

    给定一个没有重复数字的序列,返回其所有可能的全排列。 示例: 输入: [1,2,3]输出:[[1,2,3],[1,...

  • 全排列

    两种方法:第一种方法:递归: 从集合中依次选出每一个元素,作为排列的第一个元素,然后对剩余的元素进行全排列,如此递...

网友评论

      本文标题:全排列

      本文链接:https://www.haomeiwen.com/subject/rpozuqtx.html