递归解决全排列算法
2015-08-15 22:53
169 查看
排列:从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)不断将每个元素放作第一个元素,然后将这个元素作为前缀,并将其余元素继续全排列,等到出口,出口出去后还需要还原数组;
参考来源:http://blog.csdn.net/xiazdong/article/details/7986015
全排列:当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
相关文章推荐
- SpringMvc参数的传递(传值)
- Android之——利用系统权限实现手机重启(获取系统权限签名详解)
- 光栅化方法优化
- pat(A) 1007. Maximum Subsequence Sum(和最大子段)
- 获取线程处理结果的一个方法
- 【转】Scala片段 1:Folding
- Knockoutjs的环境搭建教程
- 关于c++析构函数
- 系统函数C字符串的实现(9):strrchr
- SQLite 日期类型
- 素数的Miller_Rabbin测试
- TCP协议中的三次握手和四次挥手(图解)
- Codeforces Gym 100203G G - Good elements 暴力
- 性能测试
- C语言-5
- 黑马程序员------OC中对象的存储细节
- 每天一个Linux命令-15(cut)
- Android Activity的生命周期
- POJ 1061 不定方程
- 博客迁移至博客园。用户:Jabnih