JAVA用递归实现全排列算法的示例代码
求一个n阶行列式,一个比较简单的方法就是使用全排列的方法,那么简述以下全排列算法的递归实现。
首先举一个简单的例子说明算法的原理,既然是递归,首先说明一下出口条件。以[1,2]为例
首先展示一下主要代码(完整代码在后面),然后简述
//对数组array从索引为start到最后的元素进行全排列publicvoidperm(int[]array,intstart){ if(start==array.length){//出口条件 for(inti=0;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)复原
更高阶的就是同理了!
那么我们的代码如下:
packagematrix; importjava.util.Arrays; publicclassPermutation{ /** *author:ZhaoKe *college:CUST */ //当前打印的第几个排列 privateintrow=0; //存储排列的结果 privateint[][]result; publicPermutation(int[]array){ this.row=0; this.result=newint[this.factor(array.length)][array.length]; } publicint[][]getResult(){ returnresult; } //求数组a的逆序数 publicintagainst(inta[]){ intnn=0; for(inti=0;ia[j]){ nn++; } } } returnnn; } //排列数 publicintfactor(inta){ intr=1; for(;a>=1;a--){ r*=a; } returnr; } publicvoidperm(int[]array,intstart){ if(start==array.length){ System.out.print((this.row+1)+":"); for(inti=0;i 运行该程序结果如下:
1:123逆序数是:0
2:132逆序数是:1
3:213逆序数是:1
4:231逆序数是:2
5:321逆序数是:3
6:312逆序数是:2
[1,2,3]
[1,3,2]
[2,1,3]
[2,3,1]
[3,2,1]
[3,1,2]以上就是JAVA用递归实现全排列算法的示例代码的详细内容,更多关于JAVA递归实现全排列的资料请关注毛票票其它相关文章!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。