全排列问题在公司笔试的时候非经常见,这里介绍其递归与非递归实现。

递归算法

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);  }  } }

非递归算法

1.算法简述

算法的具体描写叙述请參照此链接,写的很好。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

全排列(递归与非递归实现)相关推荐

  1. 全排列(含递归和非递归的解法)

    全排列在近几年各大网络公司的笔试中出现的比较频繁 首先来看看题目是如何要求的(百度迅雷校招笔试题). 用C++写一个函数, 如 Foo(const char *str), 打印出 str 的全排列, ...

  2. 全排列递归与非递归python实现

    全排列就是,给定一个序列,列举出该序列中元素所有的排列情况,列举方法有递归和非递归两种,详细可以见这位大神写的博客:https://blog.csdn.net/jopus/article/detail ...

  3. 拉马努金的整数拆分全排列JAVA实现非递归

    拉马努金的整数拆分全排列JAVA实现非递归 点这里: 递归方式 结果是:组合成100的可能性共有:190569292种!! 不做详细说明了,需要看文字描述的,点上面链接跳转递归方式,查看详细说明 来, ...

  4. python创建树结构、求深度_数据结构-树以及深度、广度优先遍历(递归和非递归,python实现)...

    前面我们介绍了队列.堆栈.链表,你亲自动手实践了吗?今天我们来到了树的部分,树在数据结构中是非常重要的一部分,树的应用有很多很多,树的种类也有很多很多,今天我们就先来创建一个普通的树.其他各种各样的树 ...

  5. 二叉树的几种递归和非递归式遍历:

    二叉树的几种递归和非递归式遍历: 1 #include <fstream> 2 #include <iostream> 3 4 using namespace std; 5 6 ...

  6. C#实现(递归和非递归)快速排序和简单排序

    C#实现(递归和非递归)快速排序和简单排序 本人因为最近工作用到了一些排序算法,就把几个简单的排序算法,想冒泡排序,选择排序,插入排序,奇偶排序和快速排序等整理了出来,代码用C#代码实现,并且通过了测 ...

  7. 分别用递归和非递归方式实现二叉树先序、中序和后序遍历(java实现)

    分别用递归和非递归方式实现二叉树先序.中序和后序遍历 用递归和非递归方式,分别按照二叉树先序.中序和后序打印所有的节点.我们约定:先序遍历顺序 为根.左.右;中序遍历顺序为左.根.右;后序遍历顺序为左 ...

  8. 汉诺塔的改编题(用栈求解,分别递归和非递归)

    限制不能从最左侧的塔直接移动到最右侧,也不能从最右侧直接移动到最左侧,而是必须经过中间,求当塔有N层的时候,打印最优移动过程和最优移动总步数 例如:当塔为两层时,最上层的塔记为1,最下层的塔记为2,则 ...

  9. 树的先序遍历,中序遍历,后续遍历(递归和非递归实现)

    前序遍历是先访问根节点再访问左子树最后访问右子树(中,左,右):中序遍历是先访问左子树再访问根节点最后访问右子树(左,中,右):后序遍历是先访问左子树再访问右子树最后访问根节点(左,右,中).---- ...

最新文章

  1. python电脑配置要求-1.安装python3.5及电脑环境变量的配置
  2. python 命令行参数-Python 中最好用的命令行参数解析工具
  3. 首记,一种新的企业信息化平台开发方案——AgileEAS.NET框架
  4. Jenkins启动时提示:Starting Jenkins Jenkins requires Java8 or later, but you are running 1.7.0
  5. mysql 实现按首字母字典序排序以及根据字段汉字首字母搜索
  6. Spring IOC容器-注解的方式【更简化】
  7. Java讲课笔记23:Map接口及其实现类
  8. GB28181平台介绍
  9. Tensorflow——可视化训练过程
  10. Linux01-BASH脚本编程之信号捕捉及任务计划53
  11. 建武28a对讲机最大距离_小米对讲机再出新品:不但价格低,还能一键写频
  12. 系统项目验收测试报告怎么做?2020最新测试报告模板
  13. QT 弹出pdf 或者网页【软件 help/about按钮】
  14. 欧拉图简述---(一笔画问题)
  15. 给Ubuntu服务器安装图形化界面
  16. MySQl数据库的应用
  17. 基于TI SitaraAM335x ARM Cortex-A8处理器设计的评估板的拓展IO口和0ADC接口
  18. 机甲 java_强殖机甲之变身斗士
  19. std::lock_guard使用案例及常用系统函数调用案例
  20. 怎样在微信中清理数据存储空间?经验技巧!如何在微信中清除缓存数据信息?

热门文章

  1. Ubuntu下使用WebStorm开发nodejs(一)
  2. java符号引用 直接引用_JVM的符号引用和直接引用
  3. 文件不混淆_Android Studio配置反混淆
  4. rtsp服务器搭建_如何从“零”开始搭建直播平台
  5. vba定义全局变量并赋值_利用VBA代码如何打开任意程序
  6. 地理信息系统(GIS)
  7. CVPR 2018 TRACA:《Context-aware Deep Feature Compression for High-speed Visual Tracking》论文笔记
  8. HDU 6155 Subsequence Count (DP、线性代数、线段树)
  9. AtCoder AGC001E BBQ Hard (DP、组合计数)
  10. 高德地图时间和实际差多少_独家揭秘:高德地图品牌升级背后的故事