作为一个刚接触算法设计的新手,第一次写自己对算法的理解,有不足处请多多谅解,希望对一些还没开始学算法的人有帮助
static void quan(int change,int wq[]) //换位法的全排列
{if(change==wq.length-1) {
//判断是否调换到最后一位,如果是则输出数组
for (int j = 0; j <wq.length; j++) {
System.out.print(wq[j]);}System.out.println();
//如果没有调换到最后一位则:
}else{
for(int a=change;a<wq.length;a++){
if(!check(a,change,wq)){
change(a,change,wq);//1.讲该位数字依次和排在其后面的数字交换
quan(change+1,wq); //2.进行下一位数字的调换
change(a,change,wq); //3.再换回来以便进行交换下一位
}
}
}
}
关于该算法实现全排列的思路,用到了分而治之及递归的算法思想。将问题分为排列的第一步和剩下的2部分。比如对数列 1 2 3... n,把他先分成2个部分 1(第一位)和2 3... n(剩下的)。这时我需要做的就是把后面部分(2 3 4...n )的所有排列情况前面加上第一位的数(1)就可以找到以第一位数字(1)开头的所有的排列情况,之后再将第一位数(1)和后面的数字依次交换,然后再重复上述步骤就可以依次得到以2、3、4...一直到n开头的所有排列情况,从而得到整个数列的全排列情况了。这里有人会问怎么得到后面部分的全排列呢?对于1 2 3...n-1的全排列,我们可以同样重复安照上面的求,但这样我们又必须知道1 2 3...n-2的全排列方法,但我们可以继续重复下去,最后发现只需要求解1个数的全排列了o(∩_∩)o ,我们就发现问题就这样被解决了。所以对于不知道该怎么解决的问题,通常我们可以把它划分为解决这问题的第一步和后面若干步2部分,然后依次重复分解从而达到解决问题的目的。