看下面一个例子
给出一个数组 1 2 3
列出所有的全排列
1 2 3
1 3 2
2 1 3
2 3 1
3 2 1
3 1 2
这就是全排列
思路:
T=【x1,x2,x3,x4,x5,……..xn−1,xn】
我们获得了在第一个位置上的所有情况之后(注:是所有的情况),对每一种情况,抽去序列T中的第一个位置,那么对于剩下的序列可以看成是一个全新的序列
T1=【x2,x3,x4,x5,……..xn−1,xn】
序列T1可以认为是与之前的序列毫无关联了。同样的,我们可以对这个T1进行与T相同的操作,直到T中只一个元素为止。这样我们就获得了所有的可能性。所以很显然,这是一个递归算法。
第一位的所有情况:无非是将x1与后面的所有数x2,x3,…….xn依次都交换一次
代码:
void swap(int &a,int &b)
{
int tmp = a;
a = b;
b = tmp;
}
void show(int arr[], int n)
{
for (int i = 0; i < n; i++)
{
printf("%d", arr[i]);
}
printf("\n");
}
void prim(int arr[], int p, int q)
{
if (p == q)
{
show(arr, q + 1);
}
else
{
for (int i = p; i <= q; i++)
{
swap(arr[p], arr[i]);
prim(arr, p + 1, q);
swap(arr[p], arr[i]);
}
}
}