全排列(递归与非递归实现)[通俗易懂]

全排列(递归与非递归实现)

大家好,又见面了,我是全栈君。

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

递归算法

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://javaforall.net/116403.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • html使用toast弹窗,jQuery常用工具之message和toast弹窗插件「建议收藏」

    html使用toast弹窗,jQuery常用工具之message和toast弹窗插件「建议收藏」常用工具message和toast弹窗图片预览常用工具message和toast弹窗浏览器适配支持Chrome所有版本支持Firefox所有版本支持Safari所有版本不支持IE任何版本常用工具message和toast弹窗使用教程默认调用:alert(‘请打开麦克风’)支持多参数:alert({title:’我是标题’,content:’请打开https://huajiakeji.com/’…

    2022年9月25日
    2
  • golang语言学习第一课:如何定义变量,笔记及回顾「建议收藏」

    golang语言学习第一课:如何定义变量,笔记及回顾「建议收藏」golang语言学习第一课:如何定义变量,笔记及回顾

    2022年4月21日
    44
  • java性能优化技巧二

    1. 谨慎对待Java的循环遍历Java中的列表遍历可比它看起来要麻烦多了。就以下面两段代码为例:A:1234private final List _bars;for(Bar bar : _bars) {    //Do important stuff}B:12345private final List _bars;for(int i = 0; i _bars.size(); i++) {Bar

    2022年3月11日
    41
  • 倍增

    倍增法可以有很多变化。1.用data[i][j]记录从i到他的第2j个父亲的路径长度,就可以边求LCA边求出两点距离,因为data[i][j]满足倍增的递推式:data[i][j]=data[i][j-1]+data[fa[i][j-1]][j-1]。2.用maxlen[i][j]记录i到第2^j^个父亲的路径上最长边的边权,它满足…

    2022年4月9日
    45
  • mysql 环境_MySQL怎么配置环境变量?「建议收藏」

    mysql 环境_MySQL怎么配置环境变量?「建议收藏」安装完MySQL后,如果不配置环境变量的话,每次还要转到mysql/bin目录下才能操作,下面本篇文章就来给大家介绍一下如何配置环境变量,希望对大家有所帮助。MySQL配置环境变量的步骤:1、右键【我的电脑】,选择【属性】2、选择左侧的【高级系统设置】3、在弹出的窗口点击右下角【环境变量】4、点击新建,在弹出窗口变量名输入mysql_home,变量值输入你的mysql安装路径,如图:5、编辑Pat…

    2022年6月18日
    32
  • java系统高并发解决方案(转载)[通俗易懂]

    java系统高并发解决方案(转载)[通俗易懂]转载博客地址:http://blog.csdn.net/zxl333/article/details/8454319一个小型的网站,比如个人网站,可以使用最简单的html静态页面就实现了,配合一些图片达到美化效果,所有的页面均存放在一个目录下,这样的网站对系统架构、性能的要求都很简单,随着互联网业务的不断丰富,网站相关的技术经过这些年的发展,已经细分到很细的方方面面,尤其对于大

    2022年5月31日
    26

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号