import java.util.*;
public class Perm
{
//采用递归算法实现全排列
public static void perm(int[] arr,int[] used,LinkedList<Integer>stack){
boolean flag = true;
for(int i=0;i<arr.length;i++){
if(used[i]==0){
flag = false;
used[i] = 1; //used[]用来标记arr中对应元素是否已经被使用
stack.push(arr[i]); //采用栈的数据结构保存找到的排列
perm(arr,used,stack);
used[i] = 0; //回退的过程中清除标记
stack.pop(); //相应的从结果栈中清除
}
}
if(flag){ //全部元素都已用到
for(int e:stack){
System.out.print(e+" ");
}
System.out.println();
}
}
public static void main(String[] args){
int[] arr = {1,2,3,4,5};
int[] used = new int[arr.length];
LinkedList<Integer> stack = new LinkedList<>();
perm(arr,used,stack);
}
}
这种方法比较好理解,但是需要2倍的额外空间,为了解决空间浪费的问题,可以采用下面这种方法
/*
*(A、B、C、D)的全排列为
1、A后面跟(B、C、D)的全排列
2、B后面跟(A、C、D)的全排列
3、C后面跟(A、B、D)的全排列
4、D后面跟(A、B、C)的全排列
*/
class Perm2
{
public static int count =0;
public static void perm(int[] arr,int begin){
for(int i = begin; i < arr.length; i++){
if(begin == arr.length-1){
for(int e:arr){System.out.print(e+"");}
System.out.println();
count++;
}else{
swap(arr,begin,i);
perm(arr,begin+1);
swap(arr,begin,i);
}
}
}
public static void swap(int[] arr,int i,int j){
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
public static void main(String[] args)
{
int[] arr = {1,2,3,4,5};
perm(arr,0);
System.out.println("排列总数 "+count);
}
}
这种方法不需要额外的空间,两种方法时间复杂度都很高。