Johnson-Trotter(JT)算法求全排列
Johnson-Trotter算法描述
算法 JohnsonTrotter(n)
//实现用来生成排序的 Johnson-Trotter 算法
//输入:正整数n(代表序列1,2,···,n)
//输出:{1,2,···,n}的全排列
将第一个全排列初始化为
while 存在一个移动元素 do
求最大的移动元素 k
把 k 和它箭头指向的相邻元素互换
调转所有大于 k 的元素的方向
将新排列添加到排列中
以 n=3 为例

下面我将贴出Johnson-Trotter算法的JAVA代码
package JT;
import java.util.Scanner;
public class Johnson_Trotter {
//求最大的移动元素
public static int maxk(int n, int[] array, boolean[] f) {
//k存储最大移动元素的下标
int k = -1, max = 0;
for(int i = 0; i < n; i++) {
//当前元素的方向是左边,则与左边的元素比较看是否可以移动
//若可移动则与当前可移动最大值比较
if(f[i] == false) {
if(i > 0 && array[i] > array[i - 1] && array[i] > max) {
k = i;
max = array[i];
}
}
//右边
else {
if(i < n - 1 && array[i] >array[i + 1] && array[i] > max) {
k = i;
max = array[i];
}
}
}
return k;
}
//元素和方向的交换
public static int[] swap2(int[] array, boolean[] f, int i, int j) {
int temp = array[i];
array[i] = array[j];
array[j] = temp;
boolean temp1 = f[i];
f[i] = f[j];
f[j] = temp1;
return array;
}
//调转方向
public static boolean[] Reverseid(int[] array, int k, boolean[] f) {
for(int i = 0; i < array.length; i++) {
if(array[i] > array[k]) {
f[i] = f[i] ? false : true;
}
}
return f;
}
public static void Jt(int n) {
//方向数组,false为左,true为右
boolean[] flag = new boolean[n];
//数字数组
int[] idata = new int[n];
//k为当前可移动元素的最大值
int k = 0;
//初始化两个数组
for(int i = 0; i < n; i++) {
idata[i] = i + 1;
flag[i] = false;
}
//输出第一个初始化的排列,此排列不会自动生成
for(int i = 0; i < n; i++) {
System.out.print(idata[i]);
System.out.print(flag[i]);
}
System.out.println();
//初始化k,获取第一个可移动的最大元素
k = maxk(n, idata, flag);
//循环直到没有可移动的元素
while(k != -1) {
//可向右移动
if(flag[k]) {
//移动时,将元素和方向都交换
idata = swap2(idata, flag, k, k + 1);
//此时k所在的元素已经向右交换,k也需要对应加1
k++;
}
//可向左移动
else {
idata = swap2(idata, flag, k, k - 1);
k--;
}
flag = Reverseid(idata, k, flag);//调转所有大于k的元素的方向
//输出当前的一个排列
for(int i = 0; i < n; i++) {
System.out.print(idata[i]);
System.out.print(flag[i]);
}
System.out.println();
k = maxk(n, idata, flag);//获取下一个k
}
}
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();//输入n
Jt(n);//调用算法
scan.close();
}
}
代码运行结果如下:(带有元素方向)
Please put in n :4
1false2false3false4false
1false2false4false3false
1false4false2false3false
4false1false2false3false
4true1false3false2false
1false4true3false2false
1false3false4true2false
1false3false2false4true
3false1false2false4false
3false1false4false2false
3false4false1false2false
4false3false1false2false
4true3true2false1false
3true4true2false1false
3true2false4true1false
3true2false1false4true
2false3true1false4false
2false3true4false1false
2false4false3true1false
4false2false3true1false
4true2false1false3true
2false4true1false3true
2false1false4true3true
2false1false3true4true
Process finished with exit code 0
此文章为原创,转载需说明出处。
Johnson-Trotter(JT)算法求全排列的更多相关文章
- Johnson-Trotter(JT)算法生成排列
对于生成{1,……,n}的所有n!个排列的问题,我们可以利用减治法,该问题的规模减一就是要生成所有(n-1)!个排列.假设这个小问题已经解决了,我们可以把n插入到n-1个元素的每一种排列中的n ...
- LeetCode46 回溯算法求全排列,这次是真全排列
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是LeetCode的26篇文章,我们来实战一下全排列问题. 在之前的文章当中,我们讲过八皇后.回溯法,也提到了全排列,但是毕竟没有真正写 ...
- 求全排列Permutation
是在教材(<计算机算法设计与分析(第4版)>王晓东 编著)上看见的关于求全排列的算法: 我们可以看一下书上怎么写的: #include<bits/stdc++.h> using ...
- PermutationsUnique,求全排列,去重
问题描述:给定一个数组,数组里面有重复元素,求全排列. 算法分析:和上一道题一样,只不过要去重. import java.util.ArrayList; import java.util.HashSe ...
- 蓝桥杯--算法提高 排列数 (简单dfs)
算法提高 排列数 时间限制:1.0s 内存限制:256.0MB 问题描述 0.1.2三个数字的全排列有六种,按照字母序排列如下: 012.021.102.120.201.210 输入 ...
- Java实现 蓝桥杯VIP 算法训练 排列问题
算法训练 排列问题 时间限制:1.0s 内存限制:512.0MB 问题描述 求一个0-N-1的排列(即每个数只能出现一次),给出限制条件(一张N*N的表,第i行第j列的1或0,表示为j-1这个数不能出 ...
- cb47a_c++_STL_算法_排列组合next_prev_permutation
cb47a_c++_STL_算法_排列组合next_prev_permutation 使用前必须先排序.必须是 1,2,3或者3,2,1.否者结果不准确.如果, 1,2,4,6.这样数据不会准确nex ...
- LeetCode:Permutations, Permutations II(求全排列)
Permutations Given a collection of numbers, return all possible permutations. For example, [1,2,3] h ...
- 算法笔记_099:蓝桥杯练习 算法提高 排列数(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 0.1.2三个数字的全排列有六种,按照字母序排列如下: 012.021.102.120.201.210 输入一个数n 求0~9十个数的全排 ...
随机推荐
- Python -Selenium的安装和调用
安装selenium步骤: 1.安装pip(cmd命令行管理员方式): pip install pip 也可直接搜索pip,到官网下载安装 2.安装selenium(cmd命令行管理员方式): pip ...
- vue 点击跳转路由设置
刚接触 知道有两种方法,一种是用路由,一种是原生js的 <a @click="handleClick"></a> methods:function(){ h ...
- sonarqube配置全指南,集成阿里巴巴p3c规范
环境准备 内置数据库 Sonar安装成功后,默认内置H2数据库,用于记录单次的扫描结果,对同一个project重复扫码,会覆盖之前的扫描记录,所以H2 数据库只应用于测试,不可以用于生产环境,那如果你 ...
- php不用第三个变量,交换两个数的值
//字符串版本 结合使用substr,strlen两个方法实现 $a="a"; $b="b"; echo '交换前 $a:'.$a.',$b:'.$b.'< ...
- Drf(DjangoRestFramewok)
第一部分 问题 1.前后端分离? vue.js 后端给前段返回json数据 2.移动端盛行. app 后端给app返回json数据 3.PC端应用? crm项目,前段后端一起写,运行在浏览器上. 一般 ...
- USB设备描述符和请求命令
USB设备描述符和请求命令 介绍标准的USB设备描述符和请求命令. 标准的USB描述符 当USB设备第一次连接到主机上时,要接收主机的枚举和配置,目的就是让主机知道该设备具有什么功能.是哪一类的USB ...
- npm 安装 electron 出现的奇葩错误
起因 使用yarn安装electron有时稳定,在搭配别的框架时有时又出现无解的错误了,于是打开electron官网,发现: emm,似乎官方对npm情有独钟.于是我遵从官方旨意使用npm安装elec ...
- [BUG]Uncaught TypeError: Illegal invocation at HTMLDivElement.
<div id="clickMe" key="1">点我</div> clickMe.onclick = function (event ...
- ASP.NET MVC5实现芒果分销后台管理系统(一):系统结构设计,集成AutoMapper,Log4net
在构思完系统思维脑图后,小墨回到家中,便摩拳擦掌开始了开发工作.要想迅速完成系统开发,前期系统设计和准备尤其重要,因为小墨做过太多大大小小的业务系统,准备工作也是十分顺利. 系统结构 整个系统工程结构 ...
- 《面试经典系列》- 从底层理解==和equals的区别
前言 在我们Java面试中,基础知识基本上比定会考核的点,而“==和equals的区别”则是面试官最喜欢.最经常问的问题. 但我们看了不少的文章.解释,总是一头雾水.一知半解的,往往很容忘记.今天,我 ...