下面我将贴出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也需要对应加1k++;}//可向左移动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) {System.out.print("Please put in n :");Scanner scan = new Scanner(System.in);int n = scan.nextInt();//输入nJt(n);//调用算法scan.close();}
}

代码运行结果如下:(false箭头为左,true箭头为右)

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
2false1false3true4trueProcess finished with exit code 0

本文章为原创,转载请注明出处!
我的博客:https://www.cnblogs.com/yannick99/

Johnson-Trotter算法求全排列相关推荐

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

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

  2. 应用回溯算法求全排列

    从第一位开始依次确定每一位的数字,当确定到 k 位时就分别将第 k 位及之后的数字放到第 k 位,然后按同样的方法继续确定下一位,直到最后一位被确定. 应用回溯的处理思想枚举所有的可能的排列方式. 直 ...

  3. JOHNSON TROTTER 的全排列算法

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

  4. 三种求全排列方式之比较

    一共有三种求全排列的方式: 第一种就是只适合用于非可重集的DFS实现 第二种就是可以用于可重集上的刘汝佳书上的代码 第三种就是STL中的next--permutation 在对这三种方式做了比较之后发 ...

  5. PermutationsUnique,求全排列,去重

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

  6. 蓝桥杯笔记:(给的元素不重复)求全排列(排列不可重复,排列可重复)

    1.各个元素不重复 abc,acb,....... 用next_permutataion()求全排列 #include<iostream> #include<algorithm> ...

  7. C++ STL求全排列和组合

    C++11 STL内置了求全排列的模板函数next_permutation和prev_permutation,属于<algorithm>头文件和std命名空间,使用非常方便.例如: vec ...

  8. Java递归求全排列详解

    Java递归求全排列详解 推荐博客: 博客园Java全排列递归算法,结尾的解释很形象了 csdn的大佬写的,和我下面的代码思路基本一致 全排列的递归思想解释: 全排列的数学定义就不再过多解释,考虑递归 ...

  9. 递归求全排列的学习与理解

    递归求全排列 全排列: 从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列.当m=n时所有的排列情况叫全排列. 例题: 输出自然数 1 到n所有 ...

最新文章

  1. 【错误记录】Android Studio 向 GitHub 提交代码报错 ( Push failed: Failed with error: Could not read from remote )
  2. C#_完整的RSA操作类
  3. dNet项目数据访问层代码总结
  4. FGPM:文本对抗样本生成新方法
  5. boost::icl模块实现测试 shell 来分割区间图
  6. 如何封装并发布一个属于自己的ui组件库
  7. 在java中原始时间_Java 日期时间
  8. 深入剖析cpp对象模型
  9. Java面试题:热情盛夏,分享Java大厂面试百题
  10. 服务器远程桌面日志,Windows记录远程桌面3389登录日志
  11. 数值分析常见基本算法及MATLAB代码总结
  12. 使用Redis来做浏览量统计
  13. IPS与IDS部署场景
  14. AtCoder Beginner Contest 167 Solution
  15. 实验吧天网管理系统Writeup
  16. Spectral Clustering
  17. JAVA工作日历天数(工作日/非工作日)- 基于法定节假日
  18. 培训html源码,前端培训——html源码笔记
  19. linux中如何看文件换行符,linux下的换行符
  20. htc+m8+wp+android,WP8.1版HTC One M8官方配置全揭晓

热门文章

  1. IllegalArgumentException 介绍
  2. 如何将eps/wind数据库里的数据变为stata要求的面板数据以及报错处理\改变数据类型(recast)
  3. 配置NTP服务ntpd/ntp.conf
  4. 37岁京东程序员“被猝死”,当事人辟谣:已报警
  5. web安全防火墙介绍
  6. XML编程经验――LIBXML2库使用指南
  7. 处理接口幂等性的两种常见方案
  8. 如何在vscode、remix中结合hardhat编译部署合约
  9. Ubuntu18.04耳机无声音解决方法
  10. Clickhouse 字符串函数