按顺序打印全排列
按照顺序打印数组的全排列,采用了两种方法:回溯法和递归
递归思路:例如 01234的全排列,0不变,先求1234的全排列,之后0和1交换位置,1不变,求0234全排列,然后1和2交换位置,求0134全排列,循环下去。求1234的全排列就把原问题缩小了一步,递归下去。每次交换的时候需要先排序一下。
代码
import java.util.Arrays;
public class QuanPaiLie {
public static void main(String[] args) {
int n =3; // 数组的长度
int[] a = new int[n];
// 第一种:回溯法
for(int i=0;i<n;i++){
a[i] =-1;
} // 数组先初始化为-1
int i =0;
int count=0;
//回溯法
while(i>=0){
int j;
// 在 i 位置搜索
for( j = a[i]+1;j<n;j++){
int k;
for( k = 0;k<i;k++){
if (a[k] == j){
break;
}
}
// 找到了
if( k == i) {
a[i] =j;
break;
}
}
// i找完 没有满足条件的 回溯
if( j == n){
a[i] = -1;
i--;
continue;
}
// 找完一个排列 输出
if(i == n-1){
count++;
for(int m=0;m<n;m++){
System.out.print(a[m]);
}
System.out.println();
}
// i位置找到了 换下一个位置
else{
i++;
}
}
// 递归法 先初始化数组
for(i=0;i<n;i++){
a[i] =i;
}
// 递归法
dayin(a, 0);
}
public static void dayin(int a[],int f){
if (f == a.length) {
for(int i = 0;i<a.length;i++){
System.out.print(a[i]);
}
System.out.println();
return ;
}
for(int i =0;i<a.length-f;i++){
dayin(a,f+1);
if (f+1+i<a.length){
Arrays.sort(a, f+1, a.length);
int t = a[f];
a[f] = a[f+i+1];
a[f+i+1] = t;
Arrays.sort(a, f+1, a.length);
}
}
}
}