先上代码code来源网络,侵删
#include <iostream>
using namespace std;
void perm(int arr[],int s,int e,int n)
{
if(s > e)
{
for(int i = 0;i < n;i ++)
{
cout << arr[i] << " ";//输出
}
cout << endl;
}
for(int i = s;i <= e;i ++)//递归 求出全排列
{
std::swap(arr[i],arr[s]);//交换
perm(arr,s+1,e,n);
std::swap(arr[i],arr[s]);//还原
}
}
int main()
{
int arr[] = {1,2,3,4,5};
perm(arr,0,4,5);
return 0;
}
上面是 1 2 3 4 5 数列的全排列代码
设一组数p = {r1, r2, r3, ... ,rn}, 全排列为perm(p),pn = p - {rn}。 eg: p={1,2,3,4,5}; p1 = P - {1} ,p2 = P - {2}; ...
因此perm(p) = r1perm(p1), r2perm(p2), r3perm(p3), ... , rnperm(pn)。当n = 1时perm(p} = r1。
需要注意的一点:我们的思想是“交换”,也就是直接对原数据进行修改,那么在交换之后一定还要再换回来,否则我们的原数据就发生变化了,肯定会出错
函数递归调用栈 ↓
交换#4#5 12354 -> 还原 12345
交换#3#4 12435
交换#4#5 12453 -> 还原 还原 12345
交换#3#5 12543
交换#4#5 12534 -> 还原 还原 12345
交换#2#3 13245
交换#4#5 13254 -> 还原 13245
交换#3#4 13425
交换#4#5 13452 -> 还原 还原 13245
交换#3#5 13542
交换#4#5 13524 -> 还原 还原 13245
. . .
通过交换 获得序列,在交换到#4#5(最末尾,不能再继续交换)位置后,还原(回溯到前一个位置,若还存在没有交换的,继续交换;否则再向上一层回溯)
直到所有序列输出完毕