全排列

204 阅读1分钟

从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]