递归实现全排列算法-161029

算法要点:

n个元素的全排列:一个元素放在最前方,剩下n-1个元素的全排列

出口:当就剩下一个元素需要全排列的时候,把数组打印出来就行了

http://blog.csdn.net/xiazdong/article/details/7986015------------写的比黑皮书好致敬!

没想明白的地方:当一个元素需要全排列时,这时候打印数组,说明这个时候数组整个就已经被改变了。

所以在之前,应该做 把一个元素放在最前方, 在之后,把数组恢复成原来的样子

所以要用swap函数

perm(type list[],int begin,int end)

*for()------用循环

      依次把每个元素放到前面

        然后全排列剩下的

     恢复数组本来的样子,方便下次循环的时候把其他的元素放到第一位,这样不会出现重复

161029

     

时间: 2024-10-12 13:27:55

递归实现全排列算法-161029的相关文章

递归解决全排列算法

排列:从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)出口:如果只有一个

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

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

穷举递归和回溯算法终结篇

穷举递归和回溯算法 在一般的递归函数中,如二分查找.反转文件等,在每个决策点只需要调用一个递归(比如在二分查找,在每个节点我们只需要选择递归左子树或者右子树),在这样的递归调用中,递归调用形成了一个线性结构,而算法的性能取决于调用函数的栈深度.比如对于反转文件,调用栈的深度等于文件的大小:再比如二分查找,递归深度为O(nlogn),这两类递归调用都非常高效. 现在考虑子集问题或者全排列问题,在每一个决策点我们不在只是选择一个分支进行递归调用,而是要尝试所有的分支进行递归调用.在每一个决策点有多种

字符串非重复全排列算法

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