一.全排列定义:从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); }