如何实现n个数的全排列?
例题:给定一个整型数组,然后对这个数组进行全排列
算法思路:
(1) n个数据的全排列就是=(n-1)数据的全排列+(一个元素的前缀)
(2) 出口:当只有一个元素的全排列时,则说明全排列结束,输出数组
(3) 不断将每个元素作为第一个元素,然后将这个元素作为前缀,对其他元素进行全排列,等到出口输出数组,等到出口出去后还需还原数组。
将排列的数组用排列枚举树进行表示
代码实现:
//全排列问题
public class Test {
public static int arr[] = new int[] { 1, 2, 3 };
public static void main(String[] args) {
perm(arr, 0, arr.length - 1);
}
private static void swap(int i1, int i2) {
int temp = arr[i2];
arr[i2] = arr[i1];
arr[i1] = temp;
}
public static void perm(int arr[], int begin, int end) {
if (end == begin) { // 一到递归的出口就输出数组,此数组为全排列
for (int i = 0; i <= end; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
return;
} else {
for (int j = begin; j <= end; j++) {
swap(begin, j); // for循环将begin~end中的每个数放到begin位置中去
perm(arr, begin + 1, end); // 假设begin位置确定,那么对begin+1~end中的数继续递归
swap(begin, j); // 换过去后再还原
}
}
}
}