博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
全排列(递归与非递归实现)
阅读量:6283 次
发布时间:2019-06-22

本文共 1019 字,大约阅读时间需要 3 分钟。

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

递归算法

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<<" 第 "<

非递归算法

1.算法简述
算法的具体描写叙述请參照此链接,写的很好。

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

转载地址:http://zjxva.baihongyu.com/

你可能感兴趣的文章
vue中数组变动不被监测问题
查看>>
3.31
查看>>
类对象定义 二
查看>>
收费视频网站Netflix:用户到底想要“点”什么?
查看>>
MacOS High Sierra 12 13系统转dmg格式
查看>>
关于再次查看已做的多选题状态逻辑问题
查看>>
动态下拉菜单,非hover
查看>>
政府安全资讯精选 2017年第十六期 工信部发布关于规范互联网信息服务使用域名的通知;俄罗斯拟建立备用DNS;Google打击安卓应用在未经同意情况下收集个人信...
查看>>
简单易懂的谈谈 javascript 中的继承
查看>>
iOS汇编基础(四)指针和macho文件
查看>>
Laravel 技巧锦集
查看>>
Android 使用 ViewPager+RecyclerView+SmartRefreshLayout 实现顶部图片下拉视差效果
查看>>
Flutter之基础Widget
查看>>
写给0-3岁产品经理的12封信(第08篇)——产品运营能力
查看>>
ArcGIS Engine 符号自动化配置工具实现
查看>>
小程序 · 跳转带参数写法,兼容url的出错
查看>>
flutter error
查看>>
Flask框架从入门到精通之模型数据库配置(十一)
查看>>
10年重新出发
查看>>
2019年-年终总结
查看>>