全排列

作者: 顺其自然2017 | 来源:发表于2021-03-20 15:37 被阅读0次

题目:给出一个数组,输出全部元素所有的排列结果

一、递归方法

数学思想:全排列个数为n的阶乘,数学记为n!即 n*(n-1)*(n-2)*...*1

代码实现逻辑:首先从数组全部元素中的选择一个作为最终排列完数组的第一个元素;然后再从剩下的n-1个元素中选出一个作为最终排列完数组的第二个元素(也就是数组剩下元素中的第一个元素),依次类推,直到数组中只剩下最后一个元素,则排列完毕

最终实现代码如下

#include <iostream>

using namespace std;

//全排列的递归算法

void swap ( int a, int b) {

    a= a+b;

    b = a-b;

    a =  a-b;

}

void printfArr(char * array, int count) {

      for(int i=0; i<=count; i++) {

        cout<<array[i];

        }

        cout<<endl; 

}

void permutation(char * array, int start, int end)

{

    if(start>=end)  //递归结束,打印当前这次全排列结果,返回。

    {

        printfArr(array, end);

    } else {

        for(int j=start; j<=end; j++)

        {

            swap(array[start],array[j]);  //交换元素,使每一个元素都有放在当前数组余下所有元素的第一位的机会。

            permutation(array,start+1,end); //递归调用

            swap(array[start],array[j]); //恢复原始的数组array,不影响下次递归调用。

        }

    }

}

int main()

{

    char array[]="abcd";

    cout<<"所有全排列的结果为:"<<endl;

    permutation(array,0,3);

    return 0;

}

二、站在开发者角度,基本上每种语言都会有封装好的方法供开发者使用,C++ STL库中的next_permutation()函数就可以直接拿来使用

void permutation(char * array,  int len)

{

    do {

         printfArr(array, len - 1); 

    } while(next_permutation(array, array + len));

 }

相关文章

  • 全排列与字典序

    全排列 递归实现全排列; 首先来说递归算法实现全排列: 例如,对于{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/aekwcltx.html