递归解决全排列算法

排列:从n个元素中任取m个元素,并按照一定的顺序进行排列,称为排列;

全排列:当n==m时,称为全排列;

比如:集合{ 1,2,3}的全排列为:

{ 1 2 3}

{ 1 3 2 }

{ 2 1 3 }

{ 2 3 1 }

{ 3 2 1 }

{ 3 1 2 }

我们可以将这个排列问题画成图形表示,即排列枚举树,比如下图为{1,2,3}的排列枚举树,此树和我们这里介绍的算法完全一致;

算法思路:

(1)n个元素的全排列=(n-1个元素的全排列)+(另一个元素作为前缀);

(2)出口:如果只有一个元素的全排列,则说明已经排完,则输出数组;

(3)不断将每个元素放作第一个元素,然后将这个元素作为前缀,并将其余元素继续全排列,等到出口,出口出去后还需要还原数组;

#include<iostream>

using namespace std;

void permutation(char *str, int k, int m)
{
    if (k == m)
    {
        for (int i = 0; i <= m; i++)
        {
            cout << str[i];
        }
        cout << endl;
    }
    else
    {
        for (int j = k; j <= m; j++)
        {
            swap(str[j], str[k]);
            permutation(str, k + 1, m);
            swap(str[j], str[k]);
        }
    }
}

参考来源:http://blog.csdn.net/xiazdong/article/details/7986015

时间: 2025-01-12 00:11:33

递归解决全排列算法的相关文章

递归解决全排列生成算法

排列:从n个元素中任取m个元素,并按照一定的顺序进行排列,称为排列: 全排列:当n==m时,称为全排列: 比如:集合{ 1,2,3}的全排列为: { 1 2 3} { 1 3 2 } { 2 1 3 } { 2 3 1 } { 3 2 1 } { 3 1 2 } 方法一: 我们可以将这个排列问题画成图形表示,即排列枚举树,比如下图为{1,2,3}的排列枚举树,此树和我们这里介绍的算法完全一致: 算法思路: (1)n个元素的全排列=(n-1个元素的全排列)+(另一个元素作为前缀): (2)出口:如

递归实现全排列算法-161029

算法要点: n个元素的全排列:一个元素放在最前方,剩下n-1个元素的全排列 出口:当就剩下一个元素需要全排列的时候,把数组打印出来就行了 http://blog.csdn.net/xiazdong/article/details/7986015------------写的比黑皮书好致敬! 没想明白的地方:当一个元素需要全排列时,这时候打印数组,说明这个时候数组整个就已经被改变了. 所以在之前,应该做 把一个元素放在最前方, 在之后,把数组恢复成原来的样子 所以要用swap函数 perm(type

递归解决全排列问题

#include <bits/stdc++.h> using namespace std; void Perm(char list[],int index,int len) { int i=0 ; char tmp ; if(index==len) { for(i=0;i<len;i++) { cout<<list[i]<<"," ; } cout<<endl ; } else { for(i=index;i<len;i++)

第一章 基本概念_递归的全排列算法

void perm(char *list,int i,int n){    int j,temp;    if(i==n){        for(j=0;j<=n;j++)            printf("%c",list[j]);        printf("    ");    }else{        for(j=i;j<=n;j++){            SWAP(list[i],list[j],temp);          

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

全排列算法的递归与非递归实现 全排列算法是常见的算法,用于求一个序列的全排列,本文使用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

全排列算法(递归)

全排列算法是一种经典的递归算法.例如集合{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

全排列算法(转)

列出全排列的初始思想: 解决一个算法问题,我比较习惯于从基本的想法做起,我们先回顾一下我们自己是如何写一组数的全排列的: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