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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。
   