import java.util.Arrays;
/**
* 排列的两种实现思想
* 1.基于交换
* 2.基于标签
* 本质上都是DFS
* @author Freedom
*
*/
public class Permutation {
/*
* 基于交换的全排列实现
*/
public static void dfs(int[] num,int index){
if(index==num.length)
System.out.println(Arrays.toString(num));
else
for(int j=index;j<num.length;j++){
swap(num,index,j);
dfs(num,index+1);
swap(num,index,j);
}
}
private static void swap(int[] num,int x,int y){
int temp=num[x];
num[x]=num[y];
num[y]=temp;
}
/*
* 排列的实现(基于标签):若要实现全排列,只需要满足条件数组output.length==num.length
*/
public static void dfs(int[] num,int index
,boolean[] visited,int[] output){
if(index==output.length)
System.out.println(Arrays.toString(output));
else{
for(int j=0;j<num.length;j++){
if(!visited[j]){
visited[j]=true;
output[index]=num[j];
dfs(num,index+1,visited,output);
visited[j]=false;//恢复现场
}
}
}
}
public static void main(String[] args){
int[] num={1,2,3,4};
int N=num.length;
int r=3;//A(n,r)
boolean[] visited=new boolean[N];
int[] output=new int[r];
dfs(num,0);//基于交换的全排列
dfs(num,0,visited,output);//基于标签的排列
}
}
实现排列的两种思路
最新推荐文章于 2020-04-20 22:52:38 发布