问题描述:对n个元素进行全排列,列出所有情况,例如1,2,3三个数字会得到1 2 3,1 3 2,2 1 3,2 3 1,3 1 2,3 2 1这6中情况
思路:设n为元素个数,元素集合为R(r1,r2,r3….rn),计算方法为Perm(n)
当n = 1时,则只有一种情况 r;
当n > 1时,则有(r1)Perm(R1),(r2)Perm(R2),(r3)Perm(R3) … … (rn)Perm(Rn)
以1,2,3为例全排列,共有以下排列:
1 Perm(2,3) 即:以1为前缀的所有组合
2 Perm(1,3) 即:以2为前缀的所有组合
3 Perm(2,3) 即:以3为前缀的所有组合
注:Perm(k,m)利用递归的思想即可不断划分前缀,直到只剩下1个元素,则只有一种情况,即为找到了一种排列。
代码:
# include <stdio.h>
void swap(int *i, int *j)
{
int temp = *i;
*i = *j;
*j = temp;
}
void perm(int *p, int k, int m)
{
if (k == m)
{
for (int i = 0; i <= m; i++)
{
printf("%d ", p[i]);
}
printf("\n");
}
else
{
for (int j = k; j <= m; j++)
{
swap(&p[k], &p[j]); //不断变化前缀
perm(p, k + 1, m); //递归
swap(&p[k], &p[j]); //还原集合
}
}
}
int main()
{
int arr[5] = { 1, 2, 3, 4, 5 };
perm(arr, 0, 4);
return 0;
}