生成全排列算法的实现(Johnson-Trotter)
2016-01-11 20:20
423 查看
生成全排列算法的实现(Johnson-Trotter)
如下是用Johnson-Trotter算法实现的n个数据的全排列,这些数据可任意,因为对于任意n个数据,都可与1至n这n个整数一一对应,因此,在此只需实现1到n这n个整数的全排列即可。以下是源码:
struct node{ int num; bool flag; }; void JohnsonTrotter(int n) { node* a = new node[n + 1]; int i; for (i = 0; i <= n; i++) { a[i].num = i; a[i].flag = false; } int k = 1; node tp; for (i = 1; i <= n; i++) { cout << a[i].num << " "; } cout << endl; while (k != 0) { k = 0; for (i = 1; i <= n; i++) { if (a[i].flag && a[i].num>a[i + 1].num && a[k].num<a[i].num && i<n) k = i; else if (i>1 && !a[i].flag && a[i].num>a[i - 1].num && a[k].num<a[i].num) k = i; } if (k != 0) { if (a[k].flag) { tp = a[k]; a[k] = a[k + 1]; a[k + 1] = tp; k = k + 1; } else { tp = a[k - 1]; a[k - 1] = a[k]; a[k] = tp; k = k - 1; } for (i = 1; i <= n; i++) { if (a[i].num>a[k].num) a[i].flag = (a[i].flag ? false : true); cout << a[i].num << " "; } cout << endl; } } }
这个算法是生成排列的最有效的算法之一,该算法实现的运行时间和排列的数量是呈正比的,显然,该算法的世纪那复杂度为O(n!)。除非n的值很小,否则其速度是慢得让人难以忍受的,但这不是算法的问题,而是该问题本身的复杂性。
相关文章推荐
- 在线视频播放
- 一次穿墙渗透测试,利用IPC跨域
- Mac 10.10 下修改 MySQL 5.6 的密码
- 软RAID-mdadm折腾小记
- 单例模式
- .net面试题
- 部署一个HELLO WORLD 的CFX WEBSERVICE 需要哪些包
- 使用Eclipse 4.5 + Maven 3 打包Scala/Spark项目
- 用yum查询想安装的软件
- 柔性数组
- uname命令 netstat命令
- Java NIO使用及原理分析
- SVD奇异值分解
- 启动一个支持文件上传的HTTP-Server
- git使用方法总结
- osg windows #127error
- HDU 4265 Science! 网络流解多重匹配,输出所有比配可能
- http协议
- BZOJ 3261 最大异或和 可持久化Trie
- 小菜一步一步学数据结构之(一)基本概念和术语