思路讲解:
-
一个元素的序列全排列是其本身
-
对于一个n个元素的序列(没有重复元素)而言,我们可以把其分解为n个子问题:即依次让每个元素作为首元素,剩下的n-1个元素进行全排列,例子:
对元素{1,2,3}全排列可以分解为对
以1开头,拼接上对{2,3}的全排列
以2开头,拼接上对{1,3}的全排列
以3开头,拼接上对{1,2}的全排列
依次类推,对{1,2}进行全排列就相当于,
以1开头对2进行全排列
以2开头对1进行全排列
。。。。
代码:
// start代表的是每一个子序列的第一个位置,
private static void nextPer(int[] arr, int start) {
// 当start==arr.length-1时,说明子序列的长度为1,就不用再往下分子序列了
if (start == arr.length - 1) {
System.out.println(Arrays.toString(arr))
}
//枚举该层子序列第一个位置可以取的值
for (int i = start; i < arr.length; i++) {
swop(arr, start, i);
// 该层递归的子序列第一个位置已经确定了,所以又可以往下再分
nextPer(arr, start + 1);
//递归结束回到当前层的时候,把之前交换的数字换回来,将序列恢复到初始情况
swop(arr, start, i);
}
}
// 交换数组中i和j对应位置的值
private static void swop(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}