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);*/ } }