JAVA用递归实现全排列算法的示例代码

 更新时间:2020年07月03日 14:17:57   作者:心拍数#0822  
这篇文章主要介绍了JAVA用递归实现全排列算法的相关资料,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下

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

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

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

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

首先数组[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)复原

更高阶的就是同理了!

那么我们的代码如下:

package matrix;

import java.util.Arrays;

public class Permutation {

  /**
   * author:ZhaoKe
   * college: CUST
   */
  //当前打印的第几个排列
  private int row = 0;
  //存储排列的结果
  private int[][] result;
  
  public Permutation(int[] array) {
    this.row = 0;
    this.result = new int[this.factor(array.length)][array.length];
  }
  
  public int[][] getResult() {
    return result;
  }

  //求数组a的逆序数
  public int against(int a[]) {
    int nn = 0;
    for (int i = 0; i < a.length-1; i++) {
      for (int j = i+1; j<a.length; j++) {
        if (a[i] > a[j]) {
          nn++;
        }
      }
    }
    return nn;
  }

  //排列数
  public int factor(int a) {
    int r = 1;
    for (; a>=1; a--) {
      r *= a;
    }
    return r;
  }

  public void perm(int[]array,int start) {
    if(start==array.length) {
      System.out.print((this.row+1)+": ");
      for(int i=0;i<array.length;i++) {
        this.result[row][i] = array[i];
        System.out.print(array[i]+" ");
      }
      this.row++;
      System.out.println("逆序数是:"+ this.against(array));
      System.out.print('\n');
    }
    else {
      for(int i=start;i<array.length;i++) {
        swap(array,start,i);
        perm(array,start+1);
        swap(array,start,i);
      }
    }
  } 
  
  public void swap(int[] array,int s,int i) {
    int t=array[s];
    array[s]=array[i];
    array[i]=t;
  }
  
  public void printResult() {
    for (int i = 0; i < result.length; i++) {
        System.out.println(Arrays.toString(this.result[i]));
    }
  }
  
  public static void main(String[] args) {
    int[] a = {1, 2, 3};
    Permutation p = new Permutation(a);
    p.perm(a,0);
    p.printResult();
  }
}

运行该程序结果如下:

1: 1 2 3 逆序数是:0
 
2: 1 3 2 逆序数是:1
 
3: 2 1 3 逆序数是:1
 
4: 2 3 1 逆序数是:2
 
5: 3 2 1 逆序数是:3
 
6: 3 1 2 逆序数是:2
 
[1, 2, 3]
[1, 3, 2]
[2, 1, 3]
[2, 3, 1]
[3, 2, 1]
[3, 1, 2]

以上就是JAVA用递归实现全排列算法的示例代码的详细内容,更多关于JAVA递归实现全排列的资料请关注脚本之家其它相关文章!

相关文章

  • Java中LocalDateTime的具体用法

    Java中LocalDateTime的具体用法

    本文主要介绍了Java中LocalDateTime的具体用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • JDBC数据源连接池配置及应用

    JDBC数据源连接池配置及应用

    这篇文章主要介绍JDBC建立数据库连接的两种方式,使用配置数据源的方式连接数据库,效率更高,推荐使用,希望能给大家做一个参考。
    2016-06-06
  • IDEA 自动跳出括号的快捷键分享

    IDEA 自动跳出括号的快捷键分享

    这篇文章主要介绍了IDEA 自动跳出括号的快捷键分享,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • 解决restlet client报错No response.Is the certificate valid? Click here to check.

    解决restlet client报错No response.Is the cer

    这篇文章主要介绍了解决restlet client报错No response.Is the certificate valid? Click here to check.问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • Java调用第三方接口示范的实现

    Java调用第三方接口示范的实现

    这篇文章主要介绍了Java调用第三方接口示范的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • 浅谈Java的虚拟机结构以及虚拟机内存的优化

    浅谈Java的虚拟机结构以及虚拟机内存的优化

    这篇文章主要介绍了Java的虚拟机结构以及虚拟机内存的优化,讲到了JVM的堆和栈空间及GC垃圾回收等重要知识,需要的朋友可以参考下
    2016-03-03
  • 详解IDEA用maven创建springMVC项目和配置

    详解IDEA用maven创建springMVC项目和配置

    本篇文章主要介绍了详解IDEA用maven创建springMVC项目和配置 ,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-09-09
  • java实现ftp上传 如何创建文件夹

    java实现ftp上传 如何创建文件夹

    这篇文章主要为大家详细介绍了java实现ftp上传的相关资料,教大家如何创建文件夹?具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • MyBatis参数处理实现方法汇总

    MyBatis参数处理实现方法汇总

    这篇文章主要介绍了MyBatis参数处理实现方法汇总,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • VScode 打造完美java开发环境最新教程

    VScode 打造完美java开发环境最新教程

    这篇文章主要介绍了VScode 打造完美java开发环境最新教程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12

最新评论