递归+字典序法全排列(java实现)

来源:互联网 发布:sql中left join的用法 编辑:程序博客网 时间:2024/06/17 19:01

1.递归

package cn.edu.ccnu.cs;import java.util.Scanner;public class Arrangement_dfs {    int ans;    public int[] vis;    public int[] num;    public int[] a;    public void dfs(int x,int n){        if(x==n){            for(int i=0;i<n;i++){                System.out.print(num[i]+" ");            }            System.out.println();            this.ans++;        }else{            for(int i=0;i<n;i++){                if(this.vis[i]==0){                    this.num[x]=this.a[i];                    this.vis[i]=1;                    dfs(x+1,n);                    this.vis[i]=0;                }            }        }        return ;    }    public Arrangement_dfs(){    }    public Arrangement_dfs(int length){        this.vis=new int[length];        this.num=new int[length];        this.a=new int[length];    }    public static void main(String[] args) {        int n;        Scanner cin = new Scanner(System.in);        n=cin.nextInt();        Arrangement_dfs per=new Arrangement_dfs(n);        for(int i=0;i<n;i++){            per.a[i]=i+1;        }        per.ans=0;        per.dfs(0, n);        System.out.println(per.ans);        cin.close();    }}

2.字典序法

package cn.edu.ccnu.cs;import java.util.Scanner;public class Arrange_main {    /**检查是否是最后一个序列*/    public static boolean Check(int[] num){        int n=num.length;        for(int i=0;i<n;i++){            if(num[i]!=n-i){                return true;            }        }        return false;    }    /**输出数组*/    public static void Print(int[] num){        for(int i=0;i<num.length;i++){            System.out.print(num[i]+" ");        }System.out.println();    }    /**字典序法  生成下一个排列*/    public static void nextPermutation(int[] num) {          if(num==null || num.length==0){              return;          }        int i=num.length-2;          while(i>=0 && num[i]>=num[i+1]){  //从右往左找第一个非递增的数            i--;          }        if(i>=0){            int j=i+1;              while(j<num.length && num[j]>num[i]){//  尾部递增序列找小于i位置最近的数                 j++;            }            j--;            int temp=num[i];            num[i]=num[j];              num[j]=temp;          }          reverse(num,i+1);//逆转i+1-num.length 之后的数        Print(num);    }    public static void reverse(int[] num,int index){          int l=index;          int r=num.length-1;          while(l<r){            int temp=num[l];              num[l]=num[r];              num[r]=temp;              l++;              r--;          }      }    public static void main(String[] args){        Scanner cin=new Scanner(System.in);        int n;        n=cin.nextInt();        int[] list=new int[n];        for(int i=0;i<n;i++){            list[i]=i+1;        }        long now;        now=System.currentTimeMillis();        long ans=0;        Print(list);        do{            ans++;            nextPermutation(list);        }while(Check(list));        System.out.println("number of arrangement is "+(ans+1)+"  and time cast:"+(System.currentTimeMillis()-now));        cin.close();    }}
原创粉丝点击