全排列递归算法

来源:互联网 发布:淘宝客服任职要求 编辑:程序博客网 时间:2024/05/16 15:30

我们可以将这个排列问题画成图形表示,即排列枚举树,比如下图为{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       和前面类似的操作,输出 BAC,BCA后返回第一层,返回状态为BAC       交换得:ABC第一层       第三次循环  i=2,k=0,m=3 初始为ABC       交换得:CBA       和前面类似的操作,输出 CBA,CAB后返回第一层,返回状态为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;}elsefor(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}的排列枚举树,此树和我们这里介绍的算法完全一致
0 0
原创粉丝点击