全排列(递归与非递归实现)
全排列问题在公司笔试的时候非经常见,这里介绍其递归与非递归实现。
递归算法
1、算法简述
简单地说:就是第一个数分别以后面的数进行交换
E.g:E = (a , b , c),则 prem(E)= a.perm(b,c)+ b.perm(a,c)+ c.perm(a,b)
然后a.perm(b,c)= ab.perm(c)+ ac.perm(b)= abc + acb.依次递归进行。
void swap(string &pszStr,int k,int m)
{if(k==m)return ;char tmp;tmp=pszStr[k];pszStr[k]=pszStr[m];pszStr[m]=tmp;
}
void Perm( string &pszStr , int begin , int end )
{if (begin == end) { static int s_i = 1; cout<<" 第 "<<s_i ++<<" 个排列 "<<pszStr<<endl;} else{ for (int i = begin; i <= end; i++) //第i个数分别与它后面的数字交换就能得到新的排列{ swap(pszStr,begin,i); Perm(pszStr, begin + 1, end); swap(pszStr , begin, i); } } }
非递归算法
算法的具体描写叙述请參照此链接,写的很好。http://blog.csdn.net/cpfeed/article/details/7376132
Prem( char *s ) //全排列函数
{char *pEnd = s + strlen(s) - 1;char *p = pEnd; //p代表替换点//q代表替换点的下一个数 ,pMax 代表替换点后比替换点大的最小数char *q = new char,*pMax = new char; //注意初始化。!!
while (p != s) //p == s 就结束循环 { q = p; p--; if (*p < *q) { pMax = FindMaxForOne(p,pEnd); //找与替换点交换的点 Swap(p,pMax); //交换 Reverse(q,pEnd); //将替换点后全部数进行反转 Print(s); //输出 p = pEnd; //将替换点置最后一个点。開始下一轮循环 } if (s == p) break; //结束条件 } }
char* FindMaxForOne(char *p,char *q)
{char *p1 = p;char *p2 = q;while (*p2 <= *p1) p2--;return p2;
}
转载于:https://www.cnblogs.com/yxwkf/p/5113340.html
全排列(递归与非递归实现)相关推荐
- 全排列(含递归和非递归的解法)
全排列在近几年各大网络公司的笔试中出现的比较频繁 首先来看看题目是如何要求的(百度迅雷校招笔试题). 用C++写一个函数, 如 Foo(const char *str), 打印出 str 的全排列, ...
- 全排列递归与非递归python实现
全排列就是,给定一个序列,列举出该序列中元素所有的排列情况,列举方法有递归和非递归两种,详细可以见这位大神写的博客:https://blog.csdn.net/jopus/article/detail ...
- 拉马努金的整数拆分全排列JAVA实现非递归
拉马努金的整数拆分全排列JAVA实现非递归 点这里: 递归方式 结果是:组合成100的可能性共有:190569292种!! 不做详细说明了,需要看文字描述的,点上面链接跳转递归方式,查看详细说明 来, ...
- python创建树结构、求深度_数据结构-树以及深度、广度优先遍历(递归和非递归,python实现)...
前面我们介绍了队列.堆栈.链表,你亲自动手实践了吗?今天我们来到了树的部分,树在数据结构中是非常重要的一部分,树的应用有很多很多,树的种类也有很多很多,今天我们就先来创建一个普通的树.其他各种各样的树 ...
- 二叉树的几种递归和非递归式遍历:
二叉树的几种递归和非递归式遍历: 1 #include <fstream> 2 #include <iostream> 3 4 using namespace std; 5 6 ...
- C#实现(递归和非递归)快速排序和简单排序
C#实现(递归和非递归)快速排序和简单排序 本人因为最近工作用到了一些排序算法,就把几个简单的排序算法,想冒泡排序,选择排序,插入排序,奇偶排序和快速排序等整理了出来,代码用C#代码实现,并且通过了测 ...
- 分别用递归和非递归方式实现二叉树先序、中序和后序遍历(java实现)
分别用递归和非递归方式实现二叉树先序.中序和后序遍历 用递归和非递归方式,分别按照二叉树先序.中序和后序打印所有的节点.我们约定:先序遍历顺序 为根.左.右;中序遍历顺序为左.根.右;后序遍历顺序为左 ...
- 汉诺塔的改编题(用栈求解,分别递归和非递归)
限制不能从最左侧的塔直接移动到最右侧,也不能从最右侧直接移动到最左侧,而是必须经过中间,求当塔有N层的时候,打印最优移动过程和最优移动总步数 例如:当塔为两层时,最上层的塔记为1,最下层的塔记为2,则 ...
- 树的先序遍历,中序遍历,后续遍历(递归和非递归实现)
前序遍历是先访问根节点再访问左子树最后访问右子树(中,左,右):中序遍历是先访问左子树再访问根节点最后访问右子树(左,中,右):后序遍历是先访问左子树再访问右子树最后访问根节点(左,右,中).---- ...
最新文章
- python电脑配置要求-1.安装python3.5及电脑环境变量的配置
- python 命令行参数-Python 中最好用的命令行参数解析工具
- 首记,一种新的企业信息化平台开发方案——AgileEAS.NET框架
- Jenkins启动时提示:Starting Jenkins Jenkins requires Java8 or later, but you are running 1.7.0
- mysql 实现按首字母字典序排序以及根据字段汉字首字母搜索
- Spring IOC容器-注解的方式【更简化】
- Java讲课笔记23:Map接口及其实现类
- GB28181平台介绍
- Tensorflow——可视化训练过程
- Linux01-BASH脚本编程之信号捕捉及任务计划53
- 建武28a对讲机最大距离_小米对讲机再出新品:不但价格低,还能一键写频
- 系统项目验收测试报告怎么做?2020最新测试报告模板
- QT 弹出pdf 或者网页【软件 help/about按钮】
- 欧拉图简述---(一笔画问题)
- 给Ubuntu服务器安装图形化界面
- MySQl数据库的应用
- 基于TI SitaraAM335x ARM Cortex-A8处理器设计的评估板的拓展IO口和0ADC接口
- 机甲 java_强殖机甲之变身斗士
- std::lock_guard使用案例及常用系统函数调用案例
- 怎样在微信中清理数据存储空间?经验技巧!如何在微信中清除缓存数据信息?
热门文章
- Ubuntu下使用WebStorm开发nodejs(一)
- java符号引用 直接引用_JVM的符号引用和直接引用
- 文件不混淆_Android Studio配置反混淆
- rtsp服务器搭建_如何从“零”开始搭建直播平台
- vba定义全局变量并赋值_利用VBA代码如何打开任意程序
- 地理信息系统(GIS)
- CVPR 2018 TRACA:《Context-aware Deep Feature Compression for High-speed Visual Tracking》论文笔记
- HDU 6155 Subsequence Count (DP、线性代数、线段树)
- AtCoder AGC001E BBQ Hard (DP、组合计数)
- 高德地图时间和实际差多少_独家揭秘:高德地图品牌升级背后的故事