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

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

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

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

递归算法

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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 0x00000000代码电脑蓝屏的原因_计算机0x是什么意思

    0x00000000代码电脑蓝屏的原因_计算机0x是什么意思在我们平时工作使用电脑的过程中难免会遇到各种各样的问题,有些电脑的故障,可以轻松解决,而有些问题就连重装系统都不一定解决的了,例如电脑蓝屏,而电脑蓝屏代码0x000000BE又是怎么回事呢?又该怎么解决呢?莫慌,小编这就将解决电脑蓝屏代码0x000000BE的方法告诉大家。相信遇到过蓝屏的用户都知道,当蓝屏出现时,Windows操作系统的蓝屏死机提示已经成为标志性的画面,大部分是系统崩溃的现象,令…

    2022年10月8日
  • cocoa动态方法决议及消息转发

    cocoa动态方法决议及消息转发

    2021年12月15日
  • JVM内存逃逸[通俗易懂]

    JVM内存逃逸[通俗易懂]JVM内存逃逸第一次听到JVM内存逃逸的名词时还是很懵逼的,于是赶紧各种查资料,终于搞懂了这个地方。JVM的内存分配主要在是运行时数据区(RuntimeDataAreas),而运行时数据区又分为了:方法区,堆区,PC寄存器,Java虚拟机栈(就是栈区,官方文档还是叫Java虚拟机栈),本地方法区,而内存逃逸主要是对象的动态作用域的改变而引起的,故而内存逃逸的分析就是分析对象的动态作…

    2022年5月30日
  • Windows 强制删除文件及文件夹命令「建议收藏」

    Windows 强制删除文件及文件夹命令「建议收藏」一、删除文件或目录CMD命令rd/s/q盘符:\某个文件夹  (强制删除文件文件夹和文件夹内所有文件)del/f/s/q盘符:\文件名  (强制删除文件,文件名必须加文件后缀名)二、删除文件或目录BAT命令1、新建.BAT批处理文件输入如下命令,然后将要删除的文件拖放到批处理文件图标上即可删除。DEL/F/A/Q RD/S/Q …

    2022年6月1日
  • Charles 抓包原理[通俗易懂]

    Charles 抓包原理[通俗易懂]tTransferProtocolSecure),是一种基于SSL/TLS的HTTP,所有的HTTP数据都是在SSL/TLS协议封装之上进行传输的。HTTPS协议是在HTTP协议的基础上,添加了SSL/TLS握手以及数据加密传输,也属于应用层协议。所以,研究HTTPS协议原理,最终就是研究SSL/TLS协议。运行过程我们都知道HTTPS在保证数据安全传输上使用了加密算法,但是具体是如何加…

    2022年5月28日
  • 查理德弗曼学习法

    查理德弗曼学习法费曼学习法的灵感源于诺贝尔物理奖获得者理查德·费曼(RichardFeynman),运用费曼技巧,你只需花上20分钟就能深入理解知识点,而且记忆深刻,难以遗忘。知识有两种类型,我们绝大多数人关注的都是错误的那类。第一类知识注重了解某个事物的名称。第二类知识注重了解某件事物。这可不是一回事儿。著名的诺贝尔物理学家理查德·费曼(RichardFeynman)能够理解这二者间的差别,这也是他成功最重要的原因之一。事实上,他创造了一种学习方法,确保他会比别人对事物了解的更透彻。费曼学习法可以简化为四个单词:C

    2022年6月14日

发表回复

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

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