排列组合问题在实际生活当中有很多的应用,比如八皇后问题中要求出符合要求的皇后布局,首先要有能力进行可能布局的枚举,而枚举的过程就是一个全排列的过程,而排列组合问题的代码递归式是很容易迷惑人的,我参考了很多的实现,觉得下面的实现比较好,当然我自己重写并测试了。主要是实现了全排列,排列,以及组合的递归实现,有些迷惑性。不过看了一下还有非递归实现的版本,下次再补充上吧。
//to permutate the data in an array //author:sdy //creation-time:2014/2/24-17:18 public class permutation{ private int permutationNum; public permutation(){ this.permutationNum=0; } public void permutateAll(int[] data){ this.permutationNum=0; this.permutateCoreAll(data,0); } private void permutateCoreAll(int[] data,int index){ if(data==null||data.length==0){ return; } if(index==data.length){ this.permutationNum=this.permutationNum+1; System.out.println(this.permutationNum+":"+this.printArray(data)); } else{ for(int i=index;i<data.length;i++){ int temp; temp=data[index]; data[index]=data[i]; data[i]=temp; this.permutateCoreAll(data,index+1); temp=data[index]; data[index]=data[i]; data[i]=temp; } } } public void permutate(int[] data,int k){ this.permutateCore(data,0,k); } private void permutateCore(int[] data,int index,int k){ if(index==k){ System.out.println(this.printArray(data,k)); return; } for(int i=index;i<data.length;i++){ int temp; temp=data[index]; data[index]=data[i]; data[i]=temp; this.permutateCore(data,index+1,k); temp=data[index]; data[index]=data[i]; data[i]=temp; } } private String printArray(int[] data,int length){ String str="["; for(int i=0;i<length;i++){ str+=data[i]+" "; } return str+"]"; } private String printArray(int[] data){ String str="["; for(int i=0;i<data.length;i++){ str=str+data[i]; if(i!=data.length-1){ str+=","; } } str=str+"]"; return str; } public void combine(int[] data,int k){ int[] subData=new int[k]; this.combineCore(data,data.length,k,subData); } private void combineCore(int[] data,int n,int k,int[] subData){ if(k<1||n<1||n<k) { System.out.println("the input value or their combination is illegal"); } for(int i=n;i>=k;i--){ subData[k-1]=data[i-1]; if(k>1){ this.combineCore(data,i-1,k-1,subData); }else{ System.out.println(this.printArray(subData)); } } } public static void main(String[] args){ permutation per=new permutation(); int[] data=new int[]{1,2,3,4,5,6,7}; per.permutate(data,2); System.out.println("----------------------"); per.combine(data,2); } }