博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
排列生成算法注意事项
阅读量:7120 次
发布时间:2019-06-28

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

 

通过swap方式生成的全排列并不是字典顺序的:

 

#include
#include
#include
#include
#include
using namespace std;int A[20];int cnt;int recur;void perm(int cur, int n, int *A){ recur++; if(cur==n)//empty { cnt++; for(int i=0;i
>n; for(int i=0;i

上面代码n=3时,输出如下:

1 2 3
1 3 2
2 1 3
2 3 1
3 2 1
3 1 2
6
16

可以看出叶子节点数目为6,需要递归16次(即所有的节点数目)

第一层cur 0

第二层cur 1

第n+1层cur n  都是叶节点。

但是要注意,3开头的就不是字典顺序了。

 

按顺序填充遍历方式能保证字典顺序;

#include
#include
#include
using namespace std;int n, A[50], isp[50], vis[50];int cnt;int recur;void dfs(int cur) { recur++; if(cur == n ) { cnt++; for(int i = 0; i < n; i++) printf("%d ", A[i]); printf("\n"); } else for(int i = 1; i <= n; i++) if(!vis[i]) { A[cur] = i; vis[i] = 1; dfs(cur+1); vis[i] = 0; }}int main() { scanf("%d", &n); memset(vis, 0, sizeof(vis)); dfs(0); printf("%d\n", cnt); printf("%d\n", recur); return 0;}

输出结果:

1 2 3

1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
6
16

可以看出树的节点数和上面的算法是一样的,所以效率是差不多的。但是这个算法却可以保证字典顺序生成排列。

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

你可能感兴趣的文章
UVa 642 - Word Amalgamation
查看>>
Linux下编译安装qemu和libvirt
查看>>
VS NuGet使用
查看>>
转载:margin外边距合并问题以及解决方式
查看>>
手机摇一摇功能音量大小跟系统音量一致
查看>>
mysql用一个表更新另一个表的方法
查看>>
一键安装 redmine on windows 和发邮件设置
查看>>
Gradle笔记——构建基础
查看>>
空间矢量数据(.shp文件)之JAVA操作
查看>>
Spring 学习 3- AOP
查看>>
Android 音频 OpenSL ES 录音 采集
查看>>
[Node.js] Provide req.locals data though middleware
查看>>
ASP.NET MVC Model绑定(五)
查看>>
Vijos P1448 校门外的树【多解,线段树,树状数组,括号序列法+暴力优化】
查看>>
宿主机mac os无法连接到虚拟机centos
查看>>
PHP中输出本地时间
查看>>
Android 性能优化探究
查看>>
C和C++格式转换
查看>>
[小技巧]diff的文件夹忽略使用方式
查看>>
ABP从入门到精通(1):aspnet-zero-core项目启动及各项目源码说明
查看>>