原理
全排列是将一组数按一定顺序进行排列,如果这组数有n个,那么全排列数为n!个。现以{1, 2, 3, 4, 5}为例说明如何编写全排列的递归算法。
{5}
的全排列为5
.{4, 5}
的全排列为4 5
和5 4
。{3,4,5}
的全排列为以3
开头的4 5
的全排列、4
开头的3 5
的全排列,5
开头的3 4
的全排列。
… …
设一组数p = {r1, r2, r3, … ,rn}, 全排列为perm(p),pn = p - {rn}。
因此perm(p) = r1perm(p1), r2perm(p2), r3perm(p3), … , rnperm(pn)。当n = 1时perm(p} = r1。
为了更容易理解,将整组数中的所有的数分别与第一个数交换,这样就总是在处理后n-1个数的全排列,排完之后,将数组恢复。
public class Permutate {
static int total=0;
static void swap(int[] A,int a, int b)
{
int t=A[a];
A[a]=A[b];
A[b]=t;
}
static void perm(int[] A, int start, int end)
{
if(start == end-1)
{
for(int i = 0; i < end; i++) {
System.out.print(A[i]+" ");
}
/*System.out.println("打印"+Arrays.toString(A));
System.out.println();
total++;*/
}
else
{
for(int i = start; i < end; i++)
{
swap(A,i,start);
perm(A, start + 1, end);
swap(A, i,start);
}
}
}
public static void main(String[] args) {
int[] A = {1,2,3};
perm(A, 0, A.length);
}
}
//结果
1 2 3
1 3 2
2 1 3
2 3 1
3 2 1
3 1 2