全排列算法(递归)

  全排列算法是一种经典的递归算法。例如集合{a,b,c}的全排列为{(a,b,c)、(a,c,b)、(b,a,c)、(b,c,a)、(c,b,a)、(c,a,b)}共3!种。

  递归法求解的思路是先固定第一个元素,求剩下的全排列,求剩下的全拍列时,固定剩余元素中的第一个元素,再求剩下元素的全排列,直到就剩一个元素停止。

  例如求集合{a,b,c,d}的全排列。

  1、固定元素a求{b,c,d}元素的全排列

    (1)、固定元素b求{c,d}的全排列

      1)、固定元素c ,得到一个排列方式(a,b,c,d)

      2)、固定元素d,得到一种排列方式(a,b,d,c)

    (2)、固定元素c求{b,d}的全排列

      1)、固定元素b,得到一个排列方式(a,c,b,d)

      2)、固定元素d,得到一种排列方式(a,c,d,b)

    (3)、固定元素d求{b,c}的全排列

      1)、固定元素b,得到一个排列方式(a,d,b,c)

      2)、固定元素c,得到一种排列方式(a,d,c,b)

  经过上述步骤即可得到以a为第一个元素的全排列,再分别将b,c,d固定为第一元素重复上面过程即可得到{a,b,c,d}的全排列

代码如下:

#include <iostream>

using namespace std;

int count = 0;   //计数全排列的个数
void perm(char A[], int start, int end)//A是要排列的数组,start、end表示对A[start]与A[end]之间的元素进行全排列
{
    if (start == end)
    {
        for (int i = 0;i <= end; i++)
            cout << A[i] << "  ";
        cout << endl;
        count++;
    }
    else
    {
        for (int i = start; i <= end; i++)
        {
            swap(A[i],A[start]);
            perm(A, start + 1, end);
            swap(A[i], A[start]);
        }
    }
}
int main()
{
    char A[10]={"abcdefg"};
    perm(A,0,2);  //start = 0,end = 2表示对A[0]与A[2]之间的元素进行全排列,即对{a,b,c}进行全排列
    cout<< count <<endl;
    return 0;
}

原文地址:https://www.cnblogs.com/yichenxing/p/11072714.html

时间: 2024-10-08 19:40:41

全排列算法(递归)的相关文章

全排列算法的递归与非递归实现

全排列算法的递归与非递归实现 全排列算法是常见的算法,用于求一个序列的全排列,本文使用C语言分别用递归与非递归两种方法实现,可以接受元素各不相同的输入序列. 题目来自leetcode: Given a collection of numbers, return all possible permutations. For example, [1,2,3] have the following permutations: [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3

全排列算法(转)

列出全排列的初始思想: 解决一个算法问题,我比较习惯于从基本的想法做起,我们先回顾一下我们自己是如何写一组数的全排列的:1,3,5,9(为了方便,下面我都用数进行全排列而不是字符). 1,3,5,9.(第一个) 首先保持第一个不变,对3,5,9进行全排列. 同样地,我们先保持3不变,对5,9进行全排列. 保持5不变,对9对进行全排列,由于9只有一个,它的排列只有一种:9.接下来5不能以5打头了,5,9相互交换,得到 1,3,9,5. 此时5,9的情况都写完了,不能以3打头了,得到 1,5,3,9

不会全排列算法(Javascript实现),我教你呀!

今天我很郁闷,在实验室凑合睡了一晚,准备白天大干一场,结果一整天就只做出了一道算法题.看来还是经验不足呀,同志仍需努力呀. 算法题目要求是这样的: Return the number of total permutations of the provided string that don't have repeated consecutive letters. Assume that all characters in the provided string are each unique.F

两种常用的全排列算法(java)

问题:给出一个字符串,输出所有可能的排列. 全排列有多种算法,此处仅介绍常用的两种:字典序法和递归法. 1.字典序法: 如何计算字符串的下一个排列了?来考虑"926520"这个字符串,我们从后向前找第一双相邻的递增数字,"20"."52"都是非递增的,"26 "即满足要求,称前一个数字2为替换数,替换数的下标称为替换点,再从后面找一个比替换数大的最小数(这个数必然存在),0.2都不行,5可以,将5和2交换得到"956

字符串非重复全排列算法

[题目描述] 输入一个字符串,打印出该字符串中字符的所有排列. 例如输入字符串abc,则输出由字符a.b.c 所能排列出来的所有字符串 abc.acb.bac.bca.cab 和 cba. [分析] 从集合中依次选出每一个元素,作为排列的第一个元素,然后对剩余的元素进行全排列,如此递归处理,从而得到所有元素的全排列.以对字符串abc进行全排列为例,我们可以这么做:以abc为例 固定a,求后面bc的排列:abc,acb,求好后,a和b交换,得到bac 固定b,求后面ac的排列:bac,bca,求好

n个整数全排列的递归实现(C++)

全排列是非常常用的一个小算法,下面是n个整数全排列的递归实现,使用的是C++ #include <iostream> using namespace std; int n = 0; void swap(char *a ,char *b) { int m ; m = *a; *a = *b; *b = m; } void perm(char list[],int k, int m ) { int i; if(k >m) { for(i = 0 ; i <= m ; i++) { co

【codeup】1959: 全排列 及全排列算法详解

题目描述 给定一个由不同的小写字母组成的字符串,输出这个字符串的所有全排列.我们假设对于小写字母有'a' < 'b' < ... < 'y' < 'z',而且给定的字符串中的字母已经按照从小到大的顺序排列. 输入 输入只有一行,是一个由不同的小写字母组成的字符串,已知字符串的长度在1到6之间. 输出 输出这个字符串的所有排列方式,每行一个排列.要求字母序比较小的排列在前面.字母序如下定义:已知S = s1s2...sk , T = t1t2...tk,则S < T 等价于,存

算法-递归

递归是一个很经典的算法,最常见的就是斐波那契数列,斐波那契数列指的是这样一个数列:0.1.1.2.3.5.8.13.21.……在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*),最简单的解法就是通过递归: -(NSInteger)simpleRecursive:(NSInteger)count{ if (count==1) { return 0; }else if(count==2){ return 1; } return

算法设计:全排列算法代码实现

在上星期的算法设计课程的学习中,我们学习了两种全排列算法,该算法用于求出数组{1,2,3,...,n}的所有可能的排列,今天我们就来看看这个算法的具体代码实现. 1. 第一种算法 第一种算法和我们现实生活中习惯的方法较为相似,以{1,2,3}为例,我们先写出第一种排列123,然后将2与3交换,得到132:再回到123,交换1与2得到213,再将1与3交换.....直到得到所有的排列. 该算法伪码如下: PERMUTATIONS1(int n): for j←1 to n a[j]←j end f