生成全排列算法的实现(Johnson-Trotter)
生成全排列算法的实现(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的值很小,否则其速度是慢得让人难以忍受的,但这不是算法的问题,而是该问题本身的复杂性。
生成全排列算法的实现(Johnson-Trotter)相关推荐
- JOHNSON TROTTER 的全排列算法
/*试一试Johnson Trotter的算法*/ /* 数组初始为123 标记数组b[]的初始值是011(0 不可移动,1否) /要不利用二维数组--?/ b[]中找值为一的 然后看 ...
- python怎么生成伪代码_Python零基础入门—算法的实现与伪代码
同学们好.在前面一节课,我们了什么是算法,知道了在一个算法中,要有输入.计算过程.还要有输出.这节课我们来讨论算法的实现. 这节课的内容与前面课程的课后练习有关.在课后练习中要求同学们写出计算长方形面 ...
- 算法设计与分析——Johnson Trotter算法
目录 前言 一.算法思想分析 二.算法效率分析 三.算法代码 C语言代码 后记 前言 排列与组合问题,无论是在我们生活中还是项目实际运用中,都说非常之常见的.那么,如何去运用算法思想生成全排列(一组元 ...
- Steinhaus-Johnson-Trotter 生成全排列算法
Steinhaus-Johnson-Trotter算法是一种基于最小变换的全排列生成算法,对于排列a[1...n],该算法通过将a[i],与a[i-1](或a[i+1])进行交换,生成下一个排列,直到 ...
- RSA算法和RSA数字签名算法的实现
RSA算法和RSA数字签名算法的实现 http://blog.chinaunix.net/uid-21880738-id-1813146.html 顾婷婷 李涛 (四川大学计算机系(西区) 成都 61 ...
- 游戏中常用的寻路算法的分享(3):A*算法的实现
概述 剥除代码,A* 算法非常简单.算法维护两个集合:OPEN 集和 CLOSED 集.OPEN 集包含待检测节点.初始状态,OPEN集仅包含一个元素:开始位置.CLOSED集包含已检测节点.初始状态 ...
- 【分布式ID】理解Snowflake算法的实现原理
1.概述 转载:冷饭新炒:理解Snowflake算法的实现原理 我上次也看了一个视频讲解:[分布式ID]键高并发 分布式 全局唯一 ID 雪花算法 snowflake 2.前提# Snowflake( ...
- php 红包算法教程,php仿微信红包分配算法的实现方法
php仿微信红包分配算法的实现方法 本文实例讲述了php仿微信红包分配算法的实现方法.分享给大家供大家参考,具体如下: /** * 红包分配:把一定金额随机分配给指定人数 * * @param int ...
- 基于MATLAB的图像压缩感知 算法的实现
摘要 获取项目源文件,联系Q:1415736481,可指导毕设,课设 数据压缩技术是提高无线数据传输速度的有效措施之一.传统的数据压缩技术是基于奈奎斯特采样定律进行采样,并根据数据本身的特性降低其冗余 ...
最新文章
- 前端知识点之CSS(一)
- 计算机山西特岗考试题库,山西特岗历年试题
- Android keystore/Keymaster的代码导读
- 基于cnn的短文本分类_NLP.TM[15] | 短文本相似度CNN_SIM
- .Net 平台下的版本控制 --- Subversion(SVN)1.6.x
- python和c先学哪个-python和c先学哪个
- Hyper-V 虚拟网络设置
- java interruptedexception_如何正确的处理InterruptedException
- 三级数据库技术思维导图
- 测试minio集群的上传下载速度
- 阿里巴巴高并发架构到底多牛逼?是如何抗住淘宝双11亿级并发量?
- IIS反向代理 URL重写 404或500 错误问题的解决方案
- Visio 2016去掉页边距(图形四周的空白区域)的解决办法 (适用于适应绘图)
- eclipse如何配置工作环境
- 5.Wide Deep Learning for Recommender Systems论文详细解读和代码实现
- 哈工程计算机专硕考研经验贴
- 使用Git工具上传项目代码到Gitee仓库
- 《软件测试》读书笔记(持续更新)
- 计算机房灭火器如何配置,数据中心主机房二氧化碳灭火器选型、计算和配置实例-20210407042437.pdf-原创力文档...
- Oracle 数据库创建数据库和表
热门文章
- 反相器,传输门,电平移位
- 记一次失败的实战渗透
- Wireshark软件使用
- 互联网项目发币一年,“简书们”活得好吗?
- IllegalArgumentException: wrong number of arguments
- ORACLE中的全连接(Full Join)、内连接(JOIN/INNER JOIN)、左连接(Left Join)、右连接(Left Join)、(+)符号以及Theta连接
- Luminati通过住宅IP网络工作,其可靠性如何?
- 线性表的创建和基本操作
- 安卓键盘加上数字_安卓键盘键值对照表
- Carson带你学Android:这是一份全面详细的属性动画学习攻略!