算法分析--排列问题

原创 2015年11月19日 16:51:34

算法分析–排列问题

[排列问题]
问题描述:设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步骤。

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

分治策略(递归,排列问题)

1、递归概念       直接或者间接调用自身的算法叫做递归算法。用函数自身给出定义的函数称为递归函数。有些数据结构,比如二叉树等,由于自身固有的递归特性,特别适合用递归来描述。        递归算...
  • Robin__Chou
  • Robin__Chou
  • 2015年03月05日 17:40
  • 1817

算法总结(9)--全排列问题

leetcode上涉及到的全排列,注意数组的有序,无序,数组元素是否有重复的 主要是递归算法 每个问题记住关键点,注意特殊处理–全排列问题转载 http://blog.csdn.net/more...
  • qq_26437925
  • qq_26437925
  • 2016年10月22日 21:58
  • 889

宝石排列问题

西安交大 软件53  蔡少斐 题号:5_10 题目叙述: 现有n种不同形状的宝石,每种n颗,共n*n颗。同一形状的n颗宝石分别具有n种不同的颜色c1,c2,…,cn中的一种颜色。欲将这n*n颗宝...
  • weixin_37517391
  • weixin_37517391
  • 2017年06月12日 10:37
  • 240

求全排列问题的算法

//全排列问题,近期面试的热门考题,收录于此 /* 设R={r1,r2,...rn}是要进行排列的n个元素.Ri=R-{ri}.集合X中元素的全排列记为 Perm(X).(ri)Per...
  • yangliuy
  • yangliuy
  • 2012年05月10日 22:51
  • 5203

最小长度电路板排列问题一

#include #include #include #include using namespace std;const int MAX = 50; int p[MAX][MAX]; int...
  • u012319493
  • u012319493
  • 2015年12月05日 10:11
  • 1050

算法java实现--回溯法--圆排列问题--排列树

旅行售货员问题的java实现(回溯法--排列树) 具体问题描述以及C/C++实现参见网址 http://blog.csdn.net/liufeng_king/article/details...
  • qipanliming
  • qipanliming
  • 2014年05月19日 22:09
  • 1553

数据结构与算法分析之----各种常用排序详解

数据结构排序算法介绍
  • u013393962
  • u013393962
  • 2016年04月05日 12:11
  • 3700

一个关于拼图算法的问题

现在随机生成一些PictrueBox 控件,如何把这些pictureBox合理的拼在一个Panel控件里,每个PictrueBox控件不可有重叠的部门,只能是边与边相切。pictrueBox的宽与高可...
  • hlx5214
  • hlx5214
  • 2010年11月15日 22:13
  • 346

四皇后问题代码注析 数据结构与算法分析 张琨

#include"iostream" using namespace std; class Backtracking { public: Backtracking(){ n ...
  • eettttttt
  • eettttttt
  • 2017年11月20日 18:38
  • 52

研究生课程 算法分析-回溯法和分支限界法

回溯法(backtrack)有许多问题,当需要找出它的解集或者要求回答什么解是满足某些约束条件的最佳解时,往往要使用回溯法。回溯法的基本做法是 搜索,或是一种组织得井井有条的,能避免不必要搜索的穷举式...
  • zhangxb35
  • zhangxb35
  • 2016年12月31日 13:26
  • 729
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:算法分析--排列问题
举报原因:
原因补充:

(最多只允许输入30个字)