生成全排列算法的实现(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)相关推荐

  1. JOHNSON TROTTER 的全排列算法

    /*试一试Johnson Trotter的算法*/ /* 数组初始为123   标记数组b[]的初始值是011(0 不可移动,1否)   /要不利用二维数组--?/   b[]中找值为一的   然后看 ...

  2. python怎么生成伪代码_Python零基础入门—算法的实现与伪代码

    同学们好.在前面一节课,我们了什么是算法,知道了在一个算法中,要有输入.计算过程.还要有输出.这节课我们来讨论算法的实现. 这节课的内容与前面课程的课后练习有关.在课后练习中要求同学们写出计算长方形面 ...

  3. 算法设计与分析——Johnson Trotter算法

    目录 前言 一.算法思想分析 二.算法效率分析 三.算法代码 C语言代码 后记 前言 排列与组合问题,无论是在我们生活中还是项目实际运用中,都说非常之常见的.那么,如何去运用算法思想生成全排列(一组元 ...

  4. Steinhaus-Johnson-Trotter 生成全排列算法

    Steinhaus-Johnson-Trotter算法是一种基于最小变换的全排列生成算法,对于排列a[1...n],该算法通过将a[i],与a[i-1](或a[i+1])进行交换,生成下一个排列,直到 ...

  5. RSA算法和RSA数字签名算法的实现

    RSA算法和RSA数字签名算法的实现 http://blog.chinaunix.net/uid-21880738-id-1813146.html 顾婷婷 李涛 (四川大学计算机系(西区) 成都 61 ...

  6. 游戏中常用的寻路算法的分享(3):A*算法的实现

    概述 剥除代码,A* 算法非常简单.算法维护两个集合:OPEN 集和 CLOSED 集.OPEN 集包含待检测节点.初始状态,OPEN集仅包含一个元素:开始位置.CLOSED集包含已检测节点.初始状态 ...

  7. 【分布式ID】理解Snowflake算法的实现原理

    1.概述 转载:冷饭新炒:理解Snowflake算法的实现原理 我上次也看了一个视频讲解:[分布式ID]键高并发 分布式 全局唯一 ID 雪花算法 snowflake 2.前提# Snowflake( ...

  8. php 红包算法教程,php仿微信红包分配算法的实现方法

    php仿微信红包分配算法的实现方法 本文实例讲述了php仿微信红包分配算法的实现方法.分享给大家供大家参考,具体如下: /** * 红包分配:把一定金额随机分配给指定人数 * * @param int ...

  9. 基于MATLAB的图像压缩感知 算法的实现

    摘要 获取项目源文件,联系Q:1415736481,可指导毕设,课设 数据压缩技术是提高无线数据传输速度的有效措施之一.传统的数据压缩技术是基于奈奎斯特采样定律进行采样,并根据数据本身的特性降低其冗余 ...

最新文章

  1. 前端知识点之CSS(一)
  2. 计算机山西特岗考试题库,山西特岗历年试题
  3. Android keystore/Keymaster的代码导读
  4. 基于cnn的短文本分类_NLP.TM[15] | 短文本相似度CNN_SIM
  5. .Net 平台下的版本控制 --- Subversion(SVN)1.6.x
  6. python和c先学哪个-python和c先学哪个
  7. Hyper-V 虚拟网络设置
  8. java interruptedexception_如何正确的处理InterruptedException
  9. 三级数据库技术思维导图
  10. 测试minio集群的上传下载速度
  11. 阿里巴巴高并发架构到底多牛逼?是如何抗住淘宝双11亿级并发量?
  12. IIS反向代理 URL重写 404或500 错误问题的解决方案
  13. Visio 2016去掉页边距(图形四周的空白区域)的解决办法 (适用于适应绘图)
  14. eclipse如何配置工作环境
  15. 5.Wide Deep Learning for Recommender Systems论文详细解读和代码实现
  16. 哈工程计算机专硕考研经验贴
  17. 使用Git工具上传项目代码到Gitee仓库
  18. 《软件测试》读书笔记(持续更新)
  19. 计算机房灭火器如何配置,数据中心主机房二氧化碳灭火器选型、计算和配置实例-20210407042437.pdf-原创力文档...
  20. Oracle 数据库创建数据库和表

热门文章

  1. 反相器,传输门,电平移位
  2. 记一次失败的实战渗透
  3. Wireshark软件使用
  4. 互联网项目发币一年,“简书们”活得好吗?
  5. IllegalArgumentException: wrong number of arguments
  6. ORACLE中的全连接(Full Join)、内连接(JOIN/INNER JOIN)、左连接(Left Join)、右连接(Left Join)、(+)符号以及Theta连接
  7. Luminati通过住宅IP网络工作,其可靠性如何?
  8. 线性表的创建和基本操作
  9. 安卓键盘加上数字_安卓键盘键值对照表
  10. Carson带你学Android:这是一份全面详细的属性动画学习攻略!