您的位置:首页 > 编程语言 > C语言/C++

全排列递归算法

2016-05-29 21:12 309 查看


我们可以将这个排列问题画成图形表示,即排列枚举树,比如下图为{1,2,3}的排列枚举树,此树和我们这里介绍的算法完全一致





这个算法的思想就是:
1.固定第一个元素,剩下的全排形成一个解。
2.该元素对应的解求完后,在下一个循环和第i个元素交换。这样每个元素都可以成为第一位的元素。每个循环结束后还原数组。
3.然后把第一个元素不同的排列加起来就是全部的解。

考虑三个元素ABC的全排,那么调用perm()递归的深度就是3+1=4
第一层
第一次循环  i=0,k=0,m=3
swap(0,0)没效果 还是ABC
perm(,1,3)开始对后两个元素全排
进入第二层递归!!
第一次循环 i=1,k=1,m=3
swap(1,1)无效果
perm(,2,3)最后一个元素全排
进入第三层递归!!
swap(2,2)无效果
perm(,3,3)
进入第四层递归!!

打印结果 ABC!!

返回第三层递归!!

swap(2,2)无效果,i自加得3,循环结束
返回第二层递归!!

swap(1,1)无效果,i自加得2
第二次循环 i=2,k=1,m=3
swap(2,1)交换第二第三元素得 ACB
进入第三第四层递归打印结果 ACB!!
swap(1,2)交换第二第三元素得 ABC
i自加得3,循环结束
返回第一次递归!!

swap(0,0)无效果,i自加得1

第一层
第二次循环  i=1,k=0,m=3 初始为ABC
交换得:BAC
和前面类似的操作,输出 BACBCA后返回第一层,返回状态为BAC
交换得:ABC

第一层
第三次循环  i=2,k=0,m=3 初始为ABC
交换得:CBA
和前面类似的操作,输出 CBACAB后返回第一层,返回状态为CBA
交换得:ABC

六个结果就是依次:ABC,ACB,BAC,BCA,CBA,CAB

#include<stdio.h>
#include<iostream.h>
template <class Type>//函数模板
inline void Swap(Type& a,Type& b)
{
Type
temp=a;
a=b;
b=temp;
}
template <class Type>
void Perm(Type list,int k,int m)
{
if(k==m)
{
for(int i=0;i<=m;i++)
cout<<list[i];
cout<<endl;
}
else
for(int i=k;i<=m;i++)
{
Swap(list[i],list[k]);
Perm(list,k+1,m);
Swap(list[i],list[k]);
}
}
int main()
{
int num;
char list[502];
cin>>num;
cin>>list;
Perm(list,0,num-1);
cout<<endl;
return 0;
}







我们可以将这个排列问题画成图形表示,即排列枚举树,比如下图为{1,2,3}的排列枚举树,此树和我们这里介绍的算法完全一致
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言 递归算法