求一个n阶行列式,一个比较简单的方法就是使用全排列的方法,那么简述以下全排列算法的递归实现。

首先举一个简单的例子说明算法的原理,既然是递归,首先说明一下出口条件。以[1, 2]为例

首先展示一下主要代码(完整代码在后面),然后简述

  1.   //对数组array从索引为start到最后的元素进行全排列
    public void perm(int[]array,int start) {
  2. if(start==array.length) { //出口条件
  3. for(int i=0;i<array.length;i++) {
  4. // this.result[row][i] = array[i];
  5. System.out.print(array[i]+" ");
  6. }
  7. // System.out.print(++this.row+": ");
  8. // System.out.println("逆序数是:"+ this.against(array));
  9. System.out.print('\n');
  10. }
  11. else {
  12. for(int i=start;i<array.length;i++) {
  13. swap(array,start,i); //交换数组array中索引为start与i的两个元素
  14. perm(array,start+1);
  15. swap(array,start,i);
  16. }
  17. }
  18. }

首先数组[1, 2]分析,在else的部分

调用了swap(array, 0,0)然后调用perm(array, 1)

  调用swap(array, 1, 1)然后调用perm(array, 2),然后在if里面2 == 2成立,打印[1, 2]

  调用swap(array, 1,1)把之前交换的swap(array,1,1)复原,虽然看起来没有变化

回到上一层

调用swap(array, 0, 1) 然后调用perm(array, 1)

  调用swap(array, 1, 1)然后调用perm(array, 2),然后在if里面2 == 2成立,打印[2, 1]

  调用swap(array, 1,1)把之前交换的swap(array,1,1)复原,虽然看起来没有变化

回到上一层

跳出循环,程序结束。

这就是对[1, 2]的全排列。

那么放到一般情况,[1, 2, 3]呢?
调用了swap(array, 0,0)然后调用perm(array, 1)
  然后对[2, 3]进行全排列,其中输出[1,2,3], [1, 3, 2]

再次调用swap(array,0,0)复原

调用了swap(array, 0,1)然后调用perm(array, 1)

  然后对[1,3]进行全排列,输出[2,1,3], [2,3,1]

再次调用swap(array,0,1)复原

调用了swap(array, 0,2)然后调用perm(array, 1)

  然后对[2,1]进行全排列,输出[3,2,1], [3,1,2]

再次调用swap(array,0,2)复原

更高阶的就是同理了!

那么我们的代码如下:

  1. package matrix;
  2.  
  3. import java.util.Arrays;
  4.  
  5. public class Permutation {
  6.  
  7. /**
  8. * author:ZhaoKe
  9. * college: CUST
  10. */
  11. //当前打印的第几个排列
  12. private int row = 0;
  13. //存储排列的结果
  14. private int[][] result;
  15.  
  16. public Permutation(int[] array) {
  17. this.row = 0;
  18. this.result = new int[this.factor(array.length)][array.length];
  19. }
  20.  
  21. public int[][] getResult() {
  22. return result;
  23. }
  24.  
  25. //求数组a的逆序数
  26. public int against(int a[]) {
  27. int nn = 0;
  28. for (int i = 0; i < a.length-1; i++) {
  29. for (int j = i+1; j<a.length; j++) {
  30. if (a[i] > a[j]) {
  31. nn++;
  32. }
  33. }
  34. }
  35. return nn;
  36. }
  37.  
  38. //计算阶乘
  39. public int factor(int a) {
  40. int r = 1;
  41. for (; a>=1; a--) {
  42. r *= a;
  43. }
  44. return r;
  45. }

  46.   // 打印排列数
  47. public void perm(int[]array,int start) {
  48. if(start==array.length) {
  49. System.out.print((this.row+1)+": ");
  50. for(int i=0;i<array.length;i++) {
  51. this.result[row][i] = array[i];
  52. System.out.print(array[i]+" ");
  53. }
  54. this.row++;
  55. System.out.println("逆序数是:"+ this.against(array));
  56. System.out.print('\n');
  57. }
  58. else {
  59. for(int i=start;i<array.length;i++) {
  60. swap(array,start,i);
  61. perm(array,start+1);
  62. swap(array,start,i);
  63. }
  64. }
  65. }
  66.  
  67. public void swap(int[] array,int s,int i) {
  68. int t=array[s];
  69. array[s]=array[i];
  70. array[i]=t;
  71. }
  72.  
  73. public void printResult() {
  74. for (int i = 0; i < result.length; i++) {
  75. System.out.println(Arrays.toString(this.result[i]));
  76. }
  77. }
  78.  
  79. public static void main(String[] args) {
  80. int[] a = {1, 2, 3};
  81. Permutation p = new Permutation(a);
  82. p.perm(a,0);
  83. p.printResult();
  84. }
  85. }

 运行该程序结果如下:

  1. 1: 1 2 3 逆序数是:0
  2.  
  3. 2: 1 3 2 逆序数是:1
  4.  
  5. 3: 2 1 3 逆序数是:1
  6.  
  7. 4: 2 3 1 逆序数是:2
  8.  
  9. 5: 3 2 1 逆序数是:3
  10.  
  11. 6: 3 1 2 逆序数是:2
  12.  
  13. [1, 2, 3]
  14. [1, 3, 2]
  15. [2, 1, 3]
  16. [2, 3, 1]
  17. [3, 2, 1]
  18. [3, 1, 2]

  

全排列算法--递归实现(Java)的更多相关文章

  1. 数列全排列问题----递归实现--JAVA

    public class PaiLie { /** * @param args */ public static void main(String[] args) { PaiLie p=new Pai ...

  2. Java数据结构和算法 - 递归

    三角数字 Q: 什么是三角数字? A: 据说一群在毕达哥拉斯领导下工作的古希腊的数学家,发现了在数学序列1,3,6,10,15,21,……中有一种奇特的联系.这个数列中的第N项是由第N-1项加N得到的 ...

  3. 获取所有组合算法、获取全排列算法(java)

    转载声明:原文转自:http://www.cnblogs.com/xiezie/p/5574516.html 受到ACM1015的影响,个人感觉,有必要对统计学上的 全组合和全排列 进行一个简单的总结 ...

  4. 经典算法问题的java实现 (二)

    原文地址: http://liuqing-2010-07.iteye.com/blog/1403190   1.数值转换(System Conversion) 1.1 r进制数   数N的r进制可以表 ...

  5. 全排列算法的JS实现

    问题描述:给定一个字符串,输出该字符串所有排列的可能.如输入“abc”,输出“abc,acb,bca,bac,cab,cba”. 虽然原理很简单,然而我还是折腾了好一会才实现这个算法……这里主要记录的 ...

  6. 不会全排列算法(Javascript实现),我教你呀!

    今天我很郁闷,在实验室凑合睡了一晚,准备白天大干一场,结果一整天就只做出了一道算法题.看来还是经验不足呀,同志仍需努力呀. 算法题目要求是这样的: Return the number of total ...

  7. 全排列问题(递归&非递归&STL函数)

    问题描述: 打印输出1-9的所有全排序列,或者打印输出a-d的全排列. 思路分析: 将每个元素放到余下n-1个元素组成的队列最前方,然后对剩余元素进行全排列,依次递归下去. 比如:1 2 3 为例首先 ...

  8. Dijkstra算法求最短路径(java)(转)

    原文链接:Dijkstra算法求最短路径(java) 任务描述:在一个无向图中,获取起始节点到所有其他节点的最短路径描述 Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到 ...

  9. 排序算法总结(基于Java实现)

    前言 下面会讲到一些简单的排序算法(均基于java实现),并给出实现和效率分析. 使用的基类如下: 注意:抽象函数应为public的,我就不改代码了 public abstract class Sor ...

随机推荐

  1. VS2013中带命令行参数的调试方法---C++

    今天先记录一下(也是传说中大神喜欢装逼的comment line)c++中向主函数int main(int argc,char** argv )传递4中方法,欢迎添加新方法, 然后可以参考别人写的很好 ...

  2. matlab中nargin函数输入参数数目

    来源:https://ww2.mathworks.cn/help/matlab/ref/nargin.html?searchHighlight=nargin&s_tid=doc_srchtit ...

  3. 【Office-Word妙手回春】Word文本秒转表格

    第一步:Ctrl+A组合键,文本全选 第二步:插入→表格→文本转换成表格 第三步:在"文字分隔位置",勾选相应的符号. 此处的分隔符为 空格. 点击"确定"按钮 ...

  4. RHSA-2017:2930-重要: 内核 安全和BUG修复更新(需要重启、存在EXP、本地提权、代码执行)

    [root@localhost ~]# cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) 修复命令: 使用root账号登陆She ...

  5. golang 进行grpc调用

    参考https://blog.csdn.net/qq_32744005/article/details/105606383 go get google.golang.org/grpc go get - ...

  6. vector专题

    <C++程序设计语言(第4部分:标准库)> 31.4 容器 31.4.1 vector 31.4.1.1 vector和增长 重要知识点:vector的内存布局 vector不会在添加每个 ...

  7. 多测师讲解第一个月 _综合面试题_高级讲师肖sir

    第一个月综合面试题 1.  冒烟测试是什么意思?  对主要的用例测试 2.你们公司的项目流程是什么? 3.你们公司的bug分几个级别?  4个 4.你对外键是怎么理解的? 你会使用外键吗?给一个表添加 ...

  8. pytest文档48-切换 base_url 测试环境(pytest-base-url)

    前言 当我们自动化代码写完成之后,期望能在不同的环境测试,这时候应该把 base_url 单独拿出来,能通过配置文件和支持命令行参数执行. pytest-base-url 是 pytest 里面提供的 ...

  9. 学习使用C语言/C++编程的7个步骤!超赞~

    C是一种编译性语言.如果你以前从来没有接触过任何的编程语言,那么你则需要学习一下一个拆分的逻辑思维.当我们想要写一个项目或者软件的时候,我们需要把这个整体拆分为7个步骤,这样也会让你的思路看起来更有条 ...

  10. 【贪心算法】HDU 5969 最大的位或

    题目内容 Vjudge链接 给出一个闭区间,找该区间内两个数,使这两个数的按位或最大. 输入格式 包含至多\(10001\)组测试数据. 第一行有一个正整数,表示数据的组数. 接下来每一行表示一组数据 ...