java全排列
全排列公式: 定义perm(R)是集合R的全排列,全排列即为i,perm(Ri) Ri为除了i的其他元素集合
思想: 从每个待排列组合中进行dfs,将搜索到的元素进行入栈(回溯),直到待排列的元素为0即全都入栈了那么打印栈即为一种可能排列,然后逐个出栈继续执行for循环即进行回溯操作。
递归出口:数组元素为0个。
/**
* @description: 定义perm(R)是集合R的全排列,全排列即为i,perm(Ri) Ri为除了i的其他元素集合
* @author: 司云航
* @create: 2020-07-17 08:30
*/
public class QuanPaiLie {
public static void main(String[] args) {
perm(new int[]{1,2,3},new Stack<>());
}
public static void perm(int[] array, Stack<Integer> stack) {
if(array.length <= 0) {
//进入了叶子节点,输出栈中内容
System.out.println(stack);
} else {
for (int i = 0; i < array.length; i++) { // 循环找一个开头的,每一个元素都有可能开头
//tmepArray是一个临时数组,用于就是Ri
//eg:1,2,3的全排列,先取出1,那么这时tempArray中就是2,3
int[] tempArray = new int[array.length-1];
// 下面两行为复制数组,除了array[i]不复制其他都复制
System.arraycopy(array,0,tempArray,0,i);
System.arraycopy(array,i+1,tempArray,i,array.length-i-1);
// 开头元素进栈
stack.push(array[i]);
// 递归进栈,直到叶子节点也进栈即传进去的数组是空数组时开始递归执行下面的pop语句
perm(tempArray,stack);
stack.pop();
}
}
}
}