最近上的算法实验课有一道小题目就是全排列的算法实现。2020.10.16
全排列的基本算法思想实现
首先我们可以将全排列分为俩个部分:
(1)确定第一个位置。
(2)将剩下的部分再进行全排列。
其实总的来看就是一个简单的递归,输出一组数据的全排列就是先确定第一个位置,然后剩下的部分中调用原方法,继续确定剩下数据中的第一个位置,直至到数据的最后一个位置,递归结束。
定义一个数组arr[],存储元素,在定义一个起始位置k和结束位置n(即数组的长度-1)。
下面来详细说明一个函数的执行:
(1)确定第一个位置:
首先我们得认识到从k到n的所有数都可以放在第一个位置,所以用一个for循环表示,swap将i指向起始k的位置。
(2)将剩下的数进行全排列:
这里也就是递归调用,将k+1,然后调用函数。接下来的swap是复原。
递归终止条件就是k==n,并输出排列结果。
public class Perm {
/*swap(a,b):交换数组中a,b的顺序*/
public static void swap(int test[],int a,int b){
int temp = test[a];
test[a] = test[b];
test[b] = temp;
}
public static void perm(int list[],int k,int n){
/*list是数组,k表示层数(即第几个),n是数组长度*/
/*递归终止条件*/
if(k==n){
/*已经排列到达数组最后一个,此时输出数组元素*/
for (int x:list) {
System.out.print(x+" ");
}
System.out.println();
return;
}else {
for(int i=k;i<=n;i++){
swap(list,i,k);/*使i指向k(即起始位置)*/
perm(list,k+1,n);/*递归调用*/
swap(list,i,k);/*复原*/
}
}
}
}
测试:
public static void main(String[] args) {
int[] a={1,2,3};
perm(a,0,2);
}
输出结果:
1 2 3
1 3 2
2 1 3
2 3 1
3 2 1
3 1 2
Process finished with exit code 0