1.算法思想
例如求[1,2,3,4]的全排列
- 首先需要循环4次,目的是分别得到以1,2,3,4为首的数组
- 如循环第一次,先取出1,然后将剩下的3个数再进行全排列,即再循环3次,分别取出以2,3,4位首的数组......一直到最后一个数取出
- 相对外层循环结束之后,需要还原循环语句执行之前的数组,以便下次进行全排列
package cn.tedu.basic;
import java.util.Arrays;
import java.util.Scanner;
import java.util.Stack;
public class test1 {
public static boolean check(int a[]){
// if(a[1]>a[0]&&a[3]>a[0]&&a[2]>a[1]&&a[4]>a[1]&&a[4]>a[3]&&a[5]>a[4]&&a[5]>a[2]){
// return true;
// }
if(a[1]>a[0]&&a[2]>a[0]&&a[3]>a[1]&&a[3]>a[2]){
return true;
}
return false;
}
public static void perm(int[] array, Stack<Integer> stack) {//利用循环递归,将数据存入栈中
if (array.length <= 0) { //创造递归结束条件
//进入了叶子节点,输出栈中内容
Stack<Integer> stackcopy = (Stack<Integer>) stack.clone(); //克隆一个栈stackcopy,用于对栈进行相关操作,而不改变原栈内容
int length = stack.size();
int a[] = new int[length]; //定义一个长度为栈的长度的数组,用于存储栈的内容
for (int j = 0; j < length; j++) {
a[j] = stackcopy.peek(); //先取出栈顶元素到数组
stackcopy.pop(); //然后将栈顶元素出栈
}
if (check(a)) { //判断数组是否满足条件
System.out.println(Arrays.toString(a));//该数组满足条件,打印输出满足条件的数组
}
}
else {
for (int i = 0; i < array.length; i++) { //后续就是tempArray.length
//tmepArray是一个临时数组
//例如:1,2,3的全排列,先取出1,那么这时tempArray中就是2,3
int[] tempArray = new int[array.length-1];//以a[i]为界线,tempArray存储a[i+1]~a[array.length-1]的数据
System.arraycopy(array,0,tempArray,0,i);
System.arraycopy(array,i+1,tempArray,i,array.length-i-1);
stack.push(array[i]);//1;array[i]依次入栈
perm(tempArray,stack); //递归,tempArray相对于array
stack.pop(); //栈顶元素出栈,还原array数组,以便进行下一次循环的操作
}
}
}
public static void main(String[] args) {
int p[]={1,2,3,4};
perm(p,new Stack<>());
}
}
//输出要求:a[1]>a[0]&&a[2]>a[0]&&a[3]>a[1]&&a[3]>a[2]
结果显示:
[1, 3, 2, 4]
[1, 2, 3, 4]