一.全排列定义:从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列。

全排列数f(n)=n!

二.全排列递归算法

假设对{a,b,c,d}进行全排列,可以由固定位置放元素

要对这四个进行全排列,要先确定第一个位置,再将剩下三位进行全排***定第二个位置后,再将剩下两位进行全排***定第三个位置后,第四个位置确定,到达递归出口。

总结起来:要对n个数进行全排列,先取一个数打头,再对剩下n-1个数进行全排列(此步骤重复n次,每一个数都会被取到第一个位置);对剩下n-1个数进行全排列,也是先去一个数打头,对剩下n-2个数进行全排列......直到最后剩下一个数,到达递归出口。

伪代码:

perm(m)
{
if m=n then output a[1....n]
else
for  将m至n的值赋给i
     swap(a[m],a[i])
     perm(m+1)
     swap(a[m],a[i])     在交换过程中一定要再交换回来,即取完打头的数后要再放回原来的位置再取另一个数打头
}
void swap(int& a, int& b)
{
	int temp;
	temp = a;
	a = b;
	b=temp;
}
void Perm(int m, vector<int>a)
{
	if (m == a.size()-1)
	{
		for (int i = 0; i < a.size();i++)
			cout << a[i] << " ";
		cout << endl;
	}
	else
		for (int j = m; j <= a.size()-1; j++)
		{
			swap(a[m], a[j]);
			Perm(m + 1, a);
			swap(a[m], a[j]);
		}
}
void Generating_perml(vector <int>a)
{
	Perm(0, a);
}