算法分析递归之集合的全排列问题

基于算法分析与设计——以大学生程序设计竞赛为例这本书中的第三章3.1.2集合的全排列问题

本题提出的问题是要解决n个元素的n!中排列方式,设R={r1,r2,···rn},令Ri=R-{ri}。集合的全排列记为perm(X),

则(ri)perm(X)表示在全排列perm(X)的每一个排列前加上前缀ri得到的排列。R的全排列可归纳定义如下:

当n=1时,perm(R)=(r),其中r是集合R中唯一的元素;

当n>1时,perm(R)由(r1)perm(R1),(r2)perm(R2),···,(rn)perm(Rn)构成。

本问题采用java语言进行解决的代码如下:

public class suanfa_3_3 {
    public void Perm(int list[],int k,int m) {
        if(k==m) {
            for(int i=0;i<=m;i++) 
                System.out.print(list[i]);
            System.out.println();
        }
        else {
            for(int j=k;j<=m;j++) {
                swap(list,k,j);
                Perm(list, k+1, m);
                swap(list,k,j);
            }
        }
    }
    public void swap(int[] list,int x,int y) {
        int temp;
        temp=list[x];
        list[x]=list[y];
        list[y]=temp;
    }
    public static void main(String[] args) {
        suanfa_3_3 ss=new suanfa_3_3();
        int[] list= {1,2,3,4,5,6};
        ss.Perm(list, 0, 3);
    }
}

算法分析递归之集合的全排列问题_第1张图片

算法分析递归之集合的全排列问题_第2张图片

算法分析递归之集合的全排列问题_第3张图片

此问题的解决的本质在于,先通过一个循环将n个数中的第一个数进行固定,然后进行递归,

每进行一次递归就固定下来一个数,直到还剩下最后一个数时,进行交换,并且输出,然后

再一步步的返回。

 

例如:数组list[]={1,2,3,4,5,6},则调用Perm(list,0,3)就是产生元素1-4的全排列。

算法分析递归之集合的全排列问题_第4张图片

 

 

 

你可能感兴趣的:(算法分析递归之集合的全排列问题)