从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n 个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列。
代码如下
/*
* [1,2,3]的全排列,相当于:
* [1](开头) [2,3]全排列
* [2](开头) [1,3]全排列
* [3](开头) [1,2]全排列
* 每个元素都作一次开头,然后剩余元素进行全排列
* 剩余元素求全排列同理,也是让子数组全部元素作一次开头
* 以此类推,用递归实现
*/
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class test {
public static void swap(int[] nums, int i, int j ) { //交换函数
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
public static void permutation(int[] nums, int left, int right) {
if(left == right) {
System.out.println(Arrays.toString(nums));
}
for(int i = left; i <= right; i++) { //滑动指针向右靠拢
swap(nums, left, i); //滑动指针与左边界交换,相当于让后面的元素都作一次左边界
permutation(nums, left + 1, right); //选出左边界,然后让后面的子数组重复以上步骤
swap(nums, left, i); //操作完后,要重新交换回来,不能对原数组进行改动,影响递归操作
}
}
public static void main(String[] args) {
int[] a = new int[] {1,2,3};
permutation(a, 0, a.length - 1);
}
}
输出结果为
[1, 2, 3]
[1, 3, 2]
[2, 1, 3]
[2, 3, 1]
[3, 2, 1]
[3, 1, 2]