关于数组全排列问题的解法解析(一)

来源:互联网 发布:网络文摘 1997- 编辑:程序博客网 时间:2024/06/04 20:04

作为一个刚接触算法设计的新手,第一次写自己对算法的理解,有不足处请多多谅解,希望对一些还没开始学算法的人有帮助

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部分,然后依次重复分解从而达到解决问题的目的。

0 0
原创粉丝点击