全排列(递归与非递归实现)
2016-01-08 15:17
190 查看
全排列问题在公司笔试的时候非经常见,这里介绍其递归与非递归实现。
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.依次递归进行。
算法的具体描写叙述请參照此链接,写的很好。http://blog.csdn.net/cpfeed/article/details/7376132
递归算法
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; }
相关文章推荐
- 学习html5 中的canvas(一)
- Java 线程同步
- 1.4.0 GENERATING CONTENT(生成内容)
- 如何用winscp连接suse
- NSURLSessionConfiguration API详解
- mysqldump: [ERROR] unknown variable 'delayed-inser
- 132_millionarie 百万赌博问题 (2008 APAC local onsite C)
- 工作区和暂存区
- Linux自学笔记(二)——printf、sprintf与fprintf 的用法区分
- 解析 Linux 内核可装载模块的版本检查机制
- Hibernate--fetch抓取策略
- vsftp设置匿名上传终极方法
- 设计资源汇总
- 教你如何查看百度蜘蛛来没来过你的网站
- 管理修改
- 做一个文艺范的程序员
- mark 嵌入式操作系统
- POJ 3414 Pots 记录路径的广搜
- iOS9 网络适配
- (转)mahout中k-means例子的运行