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)算法求全排列的更多相关文章

  1. Johnson-Trotter(JT)算法生成排列

        对于生成{1,……,n}的所有n!个排列的问题,我们可以利用减治法,该问题的规模减一就是要生成所有(n-1)!个排列.假设这个小问题已经解决了,我们可以把n插入到n-1个元素的每一种排列中的n ...

  2. LeetCode46 回溯算法求全排列,这次是真全排列

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是LeetCode的26篇文章,我们来实战一下全排列问题. 在之前的文章当中,我们讲过八皇后.回溯法,也提到了全排列,但是毕竟没有真正写 ...

  3. 求全排列Permutation

    是在教材(<计算机算法设计与分析(第4版)>王晓东 编著)上看见的关于求全排列的算法: 我们可以看一下书上怎么写的: #include<bits/stdc++.h> using ...

  4. PermutationsUnique,求全排列,去重

    问题描述:给定一个数组,数组里面有重复元素,求全排列. 算法分析:和上一道题一样,只不过要去重. import java.util.ArrayList; import java.util.HashSe ...

  5. 蓝桥杯--算法提高 排列数 (简单dfs)

    算法提高 排列数   时间限制:1.0s   内存限制:256.0MB      问题描述 0.1.2三个数字的全排列有六种,按照字母序排列如下: 012.021.102.120.201.210 输入 ...

  6. Java实现 蓝桥杯VIP 算法训练 排列问题

    算法训练 排列问题 时间限制:1.0s 内存限制:512.0MB 问题描述 求一个0-N-1的排列(即每个数只能出现一次),给出限制条件(一张N*N的表,第i行第j列的1或0,表示为j-1这个数不能出 ...

  7. cb47a_c++_STL_算法_排列组合next_prev_permutation

    cb47a_c++_STL_算法_排列组合next_prev_permutation 使用前必须先排序.必须是 1,2,3或者3,2,1.否者结果不准确.如果, 1,2,4,6.这样数据不会准确nex ...

  8. LeetCode:Permutations, Permutations II(求全排列)

    Permutations Given a collection of numbers, return all possible permutations. For example, [1,2,3] h ...

  9. 算法笔记_099:蓝桥杯练习 算法提高 排列数(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 0.1.2三个数字的全排列有六种,按照字母序排列如下: 012.021.102.120.201.210 输入一个数n 求0~9十个数的全排 ...

随机推荐

  1. JZOJ 1774. 合并果子 (Standard IO)

    1774. 合并果子 (Standard IO) Time Limits: 1000 ms Memory Limits: 65536 KB Description 在一个果园里,多多已经将所有的果子打 ...

  2. 在服务器上保存图片没有权限该怎么办?Permission denied:xxxxxx

    用Flask框架,写了一个上传图片的接口,把这个Flask服务用nginx+uwsgi部署在了服务器上,保存图片至服务器指定目录,显示没有权限?? 一开始我以为是nginx或者uwsgi影响的(可能很 ...

  3. iOS围绕某点缩放或旋转的AnchorPoint的设定

    经常会遇到需求,要求手势的缩放或者旋转操作,要求动作变化围绕某一个特定点,或者是两指的中心点,或者是某一个点. 这个问题首先要清晰的知道,iOS各个view的层次关系.特别是,要清除的知道,当前vie ...

  4. Iterm2 快捷操作

    窗口操作 新建窗口:Command + N 关闭所有窗口:Shift + Command + W 窗口之间切换 前一个窗口: Command + [ 后一个窗口:Command + ] 进入窗口1,2 ...

  5. kafka实现无消息丢失与精确一次语义(exactly once)处理

    在很多的流处理框架的介绍中,都会说kafka是一个可靠的数据源,并且推荐使用Kafka当作数据源来进行使用.这是因为与其他消息引擎系统相比,kafka提供了可靠的数据保存及备份机制.并且通过消费者位移 ...

  6. css 实战技巧

    css 看起来比较简单,但是要想做的好也不是那么容易,我们在平时开发中,主要用css 来美化我们的html结构,所有我觉得css 还是挺重要的,这里记录整理一些关于css 的技巧以及容易忘记的知识点. ...

  7. vue 模板 template init

    <template> <div> </div> </template> <script> export default { name: '模 ...

  8. 一文讲清楚MySQL事务隔离级别和实现原理,开发人员必备知识点

    经常提到数据库的事务,那你知道数据库还有事务隔离的说法吗,事务隔离还有隔离级别,那什么是事务隔离,隔离级别又是什么呢?本文就帮大家梳理一下. MySQL 事务 本文所说的 MySQL 事务都是指在 I ...

  9. css3笔记系列-3.css中的各种选择器详解,不看后悔系列

    点击上方蓝色字体,关注我 最详细的css3选择器解析 ​ 选择器是什么? 比较官方的解释:在 CSS 中,选择器是一种模式,用于选择需要添加样式的元素. 最常见的 CSS 选择器是元素选择器.换句话说 ...

  10. C语言之歌词解析

    0x00 脚下的路 不知道为啥要写这个小标题,可能是年轻的心想体验一下苍老的感觉,抑或是少年的一阵迷茫.混沌的四年,终究还是入了这一行.从初时的不知,到现在的刚开始,中间的间隔竟是四年之久,想起了陈奕 ...