首页 > 代码库 > 排列的学习(java)

排列的学习(java)

1.无重复排列

2.有重复排列

3,下一个排列

package 生成排列;public class Main {    static int count=0;    //a中保存原来的排列,lev表示选定第几个数,len是长度    public static  void swap(int a[],int lev,int i)    {        int temp=a[lev];        a[lev]=a[i];        a[i]=temp;                    }    public static  void swap(char a[],int lev,int i)    {        char temp=a[lev];        a[lev]=a[i];        a[i]=temp;                    }        public static void reverse(char c[],int low,int high)    {        int l=low;        int h=high;        while(l<h)        {            swap(c,l,high);            l++;            h--;                    }                            }    //利用交换法,获得排列    public static void  perm(int a[],int lev,int len)    {        if(lev==len)        {            for(int i=0;i<len;i++)            {                System.out.print(a[i]);                            }                        count++;        }        else        {            for(int i=lev;i<len;i++)            {                swap(a,lev,i);                perm(a,lev+1,len);                swap(a,lev,i);                                                                                                        }                                            }                                    }    //带有重复数字的排列        public static void perm2(int a[],int lev)    {        if(lev==a.length)        {            for(int i=0;i<a.length;i++)            {                System.out.print(a[i]);                            }            System.out.println();            count++;        }        else        {            boolean tf=true;            for(int j=lev;j<a.length;j++)            {                //对于重复的数据不再交换                for(int k=lev;k<j;k++)                {                    if(a[k]==a[j])                    {                        tf=false;                        break;                    }                }                                if(tf)                {                swap(a,lev,j);                perm2(a, lev+1);                swap(a,lev,j);                }                                                            }                                }                            }     //下一个排列 STl    public static boolean nextPerm(char c[]) //输入原始序列    {            //找到替换点        int i=c.length -2;        while(i>=0&&c[i]>=c[i+1])        {            i--;        }        if(i<0) //说明是最后一个数,翻转后        {            reverse(c,0,c.length-1);            return false;                    }        else        {        //否则的话,找到替换点        //从右边开始找到第一个大于c[i]的位置        int j=c.length-1;        while(c[j]<=c[i])        {            j--;                    }        //交换两个值        swap(c,i,j);                reverse(c,i+1,c.length -1);        return true;                }                                                                            }    public static void main(String[] args) {        // TODO Auto-generated method stub        int a[]={1,1,1,1,1};        perm2(a,0);        System.out.println(count);        char c[]="1234".toCharArray();        int count=1;    /*    while(nextPerm(c))        {                        System.out.println(c);            count++;        }        System.out.println(count);*/    }        }