Java递归全排列
目录
1, 全排列实现思路
排列组合概念
理解
2,全排列的重点
3,全排列java实现
Java:
结果:
总结:
1, 全排列实现思路
排列组合概念
排列,就是指从给定n个数的元素中取出指定m个数的元素,进行排序
组合,则是指从给定n个数的元素中仅仅取出指定m个数的元素,不考虑排序
全排列就是从“第一个字符”起,“每个字符”分别与它“后面的字符”交换,复杂度为O(n!)
理解
- A依次和BCD交换
- 交换一次后不急(如先进行A跟B交换后有,不急着交换AC、AD,先变成BACD),target后移,再依次交换
- 直到target=最后一个数时,停止,输出
- 返回上一步(用递归)接着做,此时要注意,把换了的数再还回来
2,全排列的重点
全排列难的是怎么理解这个过程;确实也不怎么好理解。
// 2 先进行交换swapIndex(array, index, i);// 3. 递归fullPermutation(array, index + 1);// 5. 返回上层,交换换回来swapIndex(array, index, i);
3,全排列java实现
Java:
public class FullPermutationT {public static void main(String[] args) {
// Integer[] array = {1,2,3,4,5};
// // 1.从0开始
// fullPermutation(array, 0);String[] strArr = {"A","B","C", "D"};// 1.从0开始fullPermutation(strArr, 0);}public static <T> void fullPermutation(T[] array, int index) {if (index == array.length) {// 4.停止,进行输出System.out.println(Arrays.toString(array));return;}for (int i = index; i < array.length; i++) {// 2 先进行交换swapIndex(array, index, i);// 3. 递进 target 往后移动fullPermutation(array, index + 1);// 5. 返回上层,交换换回来swapIndex(array, index, i);}}/*** 交换arr中i和j的值* @param array* @param i* @param j*/public static <T> void swapIndex(T[] array, int i, int j) {T temp = array[i];array[i] = array[j];array[j] = temp;}}
结果:
[A, B, C, D][A, B, D, C][A, C, B, D][A, C, D, B][A, D, C, B][A, D, B, C][B, A, C, D][B, A, D, C][B, C, A, D][B, C, D, A][B, D, C, A][B, D, A, C][C, B, A, D][C, B, D, A][C, A, B, D][C, A, D, B][C, D, A, B][C, D, B, A][D, B, C, A][D, B, A, C][D, C, B, A][D, C, A, B][D, A, C, B][D, A, B, C]
总结:
理解全排列递归的过程,并不直观。实现相对来说是比较简单的,主要是理解了。后面有机会把理解写得清楚一些。