之前就写过两篇关于全排列算法的博文,一个是转来的,另一个是根据STL中一个全排列的原理自己写的,然后今天自己想了一个全排列算法,感觉比之前的两个都容易懂些,记录在此。这个方法同样可以用于元素有重复的情况,只需加一步去重。比如说要排列的元素为:1,1,2,3,此程序会认为1 1 2 3 和 1 1 2 3是不一样的,所以会有两个1 1 2 3,去掉重复的结果就可以了。
public class Permutation {
static final int N = 4;
static int[] c = new int[N];//记录要显示的元素的下标
static int[] a = new int[]{1,2,3,4};
public static void main(String[] args) {
perm(0, N);
}
private static void perm(int k, int n) {
if(k==n){
for(int i=0; i<N; i++)
System.out.print(a[c[i]]);
System.out.println();
}else{
for(int j=0; j<N; j++){
for(int i=0; i<k; i++){
if(c[i]==j){//j已存在于c中
j++;
if(j>=N){
return;
}
i=-1;//从头判断新的j是否已经存在于c中
}
}
c[k] = j;
perm(k+1, n);
}
}
}
}