关闭

算法分析--排列问题

231人阅读 评论(0) 收藏 举报
分类:

算法分析–排列问题

[排列问题]
问题描述:设R={r1,r2,r3,……,rn}是要进行排列的n个元素,Ri=R-{ri}.集合X中元素的全排列记为Perm(X)。(r1)Perm(X)表示在全排列Perm(X)的每一个排列前加上前缀ri得到的排列。R的全排列可以归纳定义如下:
1. 当n=1时,Perm(R)=(r),其中Perm(R)=(r),其中r是结合R中唯一的元素;
2. 当n>1时,Perm(R)由(r1)Perm(R1),(r2)Perm(R2),……,(rn)Perm(Rn)构成。

实现的递归算法如下(c++实现):
#include
using namespace std;

inline void Swap(int &a,int &b){
int t;
t=a;
a=b;
b=t;
}
void Perm(int list[3],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[k],list[i]);
Perm(list,k+1,m);
Swap(list[k],list[i]);
}
}
int main(){
int list[3]={1,2,3};
Perm(list,0,2);
return 0;
}

分析:

  1. 在k=0时,i=0,交换list[0]和list[0],(相当于未发生交换),进入第一轮递归Perm(list,1,2);
  2. 此时k=1,i=1,交换list[1]和list[1],(相当于未发生交换),进入Perm(list,2,2),打印输出123;第一个全排列结果输出;跳出Perm(list,2,2),交换list[1]和list[1];
  3. 进入k=1时,循环发生,i=2(因为i在第2步时已=1,进入for循环,i=2),交换list[1]和list[2],进入Perm(list,2,2);打印输出结果132;跳出Perm(list,2,2),交换list[1]和list[2];跳出循环,因为i=2,所以跳出Perm(list,1,2),交换list[0]和list[0];
  4. 此时k=0,i=1,交换list[0]和list[1],进入Perm(list,1,2);
  5. 此时k=1,i=1,交换list[1]和list[1],(相当于未发生交换),进入Perm(list,2,2),打印输出213;第三个全排列结果输出;跳出Perm(list,2,2),交换list[1]和list[1];
  6. 进入k=1时,循环发生,i=2(因为i在第2步时已=1,进入for循环,i=2),交换list[1]和list[2],进入Perm(list,2,2);打印输出结果231;跳出Perm(list,2,2),交换list[1]和list[2];跳出循环,因为i=2,所以跳出Perm(list,1,2),交换list[0]和list[0];
  7. 重复4-6步骤。

实验结果:
这里写图片描述

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:3582次
    • 积分:123
    • 等级:
    • 排名:千里之外
    • 原创:12篇
    • 转载:3篇
    • 译文:0篇
    • 评论:0条
    文章分类