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

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

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

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

递归算法

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)
上一篇 2022年1月21日 下午10:00
下一篇 2022年1月21日 下午11:00


相关推荐

  • https的原理「建议收藏」

    https的原理「建议收藏」看完这篇文章,我奶奶都懂了https的原理|一起编程网 …

    2025年9月25日
    7
  • webpack/vue-cli 中的 publicPath / 和 ./ 的区别

    webpack/vue-cli 中的 publicPath / 和 ./ 的区别webpack vue cli 中的 publicPath 和 的区别在说这个问题之前 vue cli 的配置文档已经说的非常清楚了 publicPath 而 webpack 对于 publicPath 的描述相对苍白 但是 vue cli 对于我们来说也是一个黑盒子 我们只知道 publicPath 可以配置 或者 my app 这种自定义 URL 但是 你真的理解 webpack 里面的 publicPath 吗 准备环境 nginx 模拟一个真实的 URL 和高仿真项目

    2026年3月18日
    1
  • 不用 499、不用折腾!OpenClaw 远程安装现在 AI 自己就能干

    不用 499、不用折腾!OpenClaw 远程安装现在 AI 自己就能干

    2026年3月13日
    3
  • 工作流引擎 Activiti 万字详细进阶

    工作流引擎 Activiti 万字详细进阶Activiti 进阶一 流程实例什么是流程实例流程实例 ProcessInsta 代表流程定义的执行实例 一个流程实例包括了所有的运行节点 我们可以利用这个对象来了解当前流程实例的进度等信息 例如 用户或程序按照流程定义内容发起一个流程 这就是一个流程实例 流程定义和流程实例的图解 启动流程实例并添加 Businesskey 业务标识 流程定义部署在 activiti 后 就可以在系统中通过 activiti 去管理该流程的执行 执行流程表示流程的一次执行 比如部署系统出差流程后 如果

    2026年3月18日
    3
  • 白话经典算法系列之七 堆与堆排序

    白话经典算法系列之七 堆与堆排序

    2021年11月23日
    48
  • 基于FPGA的CAN接口开发

    基于FPGA的CAN接口开发基于Xilinx的A7系列FPGA的CAN总线协议开发一、CAN总线协议介绍CAN是ControllerAreaNetwork的缩写(以下称为CAN),是ISO国际标准化的串行通信协议。可以用来满足“多总线通信时,线束的数量过多”、“通过多个LAN,进行大量数据的高速通信”的需要。它的出现为分布式控制系统实现各节点之间实时、可靠的数据通信提供了强有力的技术支持。CAN控制器根据两根线上的电位差来判断总线电平。总线电平分为显性电平和隐性电平,二者必居其一。发送方通过使总线电平发生变化

    2022年6月17日
    39

发表回复

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

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