递归与分治策略-2.1.4全排列

来源:互联网 发布:qq强制视频软件2015 编辑:程序博客网 时间:2024/06/04 19:47
public class test2_1_4 {    public static void perm(Object[] list,int k,int m){        //产生list[k:m]的所有排列        if(k==m){            //只剩一个元素            for(int i=0;i<=m;i++)                System.out.print(list[i]);            System.out.println();        }else{            //还有多个元素,递归产生排列            for(int i=k;i<=m;i++){                swap(list,k,i);                perm(list,k+1,m);                swap(list,k,i);            }        }    }    public static void swap(Object[] list,int i,int j){        Object obj;        obj = list[i];        list[i] = list[j];        list[j] = obj;    }    public static void main(String[] args) {        Object[] list = {"1","2","3"};        perm(list,0,list.length-1);    }}

运行结果如下:

123132213231321312

递归调用详细过程:

                1.swap(list,2,2);                  perm(list,3,3);   123                  swap(list,2,2);  swap(list,1,1); 2.swap(list,2,3); perm(list,2,3);   perm(list,3,3);   132swap(list,1,1);   swap(list,2,3);----------------------------------                1.swap(list,2,2);                  perm(list,3,3);   213                  swap(list,2,2);  swap(list,1,2); 2.swap(list,2,3); perm(list,2,3);   perm(list,3,3);   231swap(list,1,2);   swap(list,2,3);----------------------------------                1.swap(list,2,2);                  perm(list,3,3);   321                  swap(list,2,2);  swap(list,1,3); 2.swap(list,2,3); perm(list,2,3);   perm(list,3,3);   312swap(list,1,3);   swap(list,2,3);----------------------------------