版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、全排列,1、首先看最后两个数4, 5。 它们的全排列为4 5和5 4, 即以4开头的5的全排列和以5开头的4的全排列。由于一个数的全排列就是其本身,从而得到以上结果。2、再看后三个数3, 4, 5。它们的全排列为3 4 5、3 5 4、 4 3 5、 4 5 3、 5 3 4、 5 4 3 六组数。即以3开头的和4,5的全排列的组合、以4开头的和3,5的全排列的组合和以5开头的和3,4的全排列的组合.从而可以推断,设一组数p = r1, r2, r3, . ,rn, 全排列为perm(p),pn = p- rn。因此perm(p) = r1perm(p1), r2perm(p2), r3per
2、m(p3), . , rnperm(pn)。当n = 1时perm(p = r1。为了更容易理解,将整组数中的所有的数分别与第一个数交换,这样就总是在处理后n-1个数的全排列,两个例子,123的全排列-首先遍历元素,然后把遍历到的每一个元素都和第一个元素交换第一个和第一个交换 就是1和1交换 最后还是123那么就形成了 123 213 321 这样的3组(交换后 再换回来 还原成123 因为后面的交换都是在123的基础上交换的 所以swap要写2次)-检查每一组除了第一个之外的剩余元素, 如果这些元素个数是2,那么就对这剩下的2个元素全排列 就是123 132 , 213 231 , 321
3、312 2个元素的全排列很简单 就是把这2个元素交换位置就OK),两个例子,1234的全排列-首先遍历元素,然后把遍历到的每一个元素都和第一个元素交换那么就形成了 1234 2134 3214 4231 这样的4组-检查每一组除了第一个之外的剩余元素, 如1234剩余的是234,发现是3个元素那么问题就转换为求234的全排列了接下来也是一样 问题转换为求134, 214, 231的全排列像这样 总是对除了第一个之外的元素全排列, 每次元素的个数都在减少一个,求N个元素全排列最终就变成求2的元素的全排列了,求n个元素的全排列。,分析:n=1 输出a1; n=2 输出a1 a2; a2 a1; n
4、=3 输出a1 a2 a3; a1 a3 a2; a2 a1 a3; a2 a3 a1; a3 a2 a1; a3 a1 a2; 归纳:n=3时排列的分类 (1)a1类:a1之后跟a2,a3的全排列; (2)a2类:a2之后跟a1,a3的全排列; (3)a3类:a3之后跟a2,a1的全排列。,将(1)中的a1,a2互换位置,得到(2); 将(1)中的a1,a3互换位置,得到(3).,可以用循环重复执行“交换位置,后跟剩余序列的所有排列”;对剩余的序列再使用该方法,直至没有剩余序列递归调用,由排列组合的知识可知,n个元素的全排列共有n!种。 n!可分解为n*(n-1)!种,而 (n-1)!又分解
5、为(n-1)(n-2)!种, 依次类推。,若用一个数组an来保存1n之间的n个自然数,对于i =1n,每次使a1同ai交换后,对a2an中的n-1个元素进行全排列,然后再交换a1与ai的值,使它恢复为此次排列前的状态; 同样,对于a3an区间内的n-2个元素进行全排列,然后再把交换的元素交换回来; 依次类推,直到对an进行全排列时,输出整个数组的值,即得到一种排列结果。,n=3 1 2 3 1 3 2 2 1 3 2 3 1 3 2 1 3 1 2,n=4 1 2 3 4 1 2 4 3 1 3 2 4 1 3 4 2 1 4 3 2 1 4 2 3 2 1 3 4 2 1 4 3 2 3 1
6、 4 2 3 4 1 2 4 3 1 2 4 1 3,3 2 1 4 3 2 4 1 3 1 2 4 3 1 4 2 3 4 1 2 3 4 2 1 4 2 3 1 4 2 1 3 4 3 2 1 4 3 1 2 4 1 3 2 4 1 2 3,procedure range(a,k,n) if k=n then print(a) else for i k to n do ak ai; call range(a,k+1,n); ak ai; endif endrange;,对于n个元素a=(a1a2akan), 设过程range(a, k, n)是求a的第k到第n个元素的全排列。 算法如下:
7、procedure range(a,k,n); 当k指向最后元素时, 递归终止,输出相应的字符串a 否则 i从k到n重复执行: 交换ak与ai ; range(a, k+1, n); 交换ak与ai ; endrange;,Void Perm(Type list,int k, int m) /递归的产生前缀是list0:k-1后缀是listk:m的全排列的所有排列 if(k=m)/只剩下一个元素 for(int i=0;i=m;i+) coutlisti; coutendl; else/还有多个元素待排列,递归产生排列 for(int i=k;i=m;i+) Swap(listk,listi); Perm(list,k+1,m); Swap(listk,listi; ,为什么需要交换两次,举个例子 比如现在数组的数据是 123 算法是这样的 1和3先交换 变成了321 然后递归
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 11.2犯罪与刑罚 教学设计(表格式) 道德与法治七年级下册 统编版
- DB5308T 73-2023 金钗石斛栽培技术规程
- DB5307T 24-2019 一般湿地认定
- 生产用电安全操作准则
- 2026广东揭阳市揭东区审计局招聘政府雇员1人备考题库参考答案详解
- 2026西北大学附属小学招聘备考题库及1套完整答案详解
- 2026广西河池环江毛南族自治县公安局招聘第二批警务辅助人员10人备考题库含答案详解
- 2026江苏无锡市杨市水蜜桃有限公司编外工作人员招聘1人备考题库及答案详解一套
- 2026浙江舟山市定海区交通运输局招聘编外用工人员1人备考题库(第二批)及一套答案详解
- 上海华力2026届春招补录备考题库及参考答案详解一套
- 雨课堂学堂在线学堂云《键盘即兴协作与创编(四川师范)》单元测试考核答案
- 2026年中考《语文》作文10大主题抢分万能模板
- 《义务教育语文课程标准2025》
- 影像报告书写不规范病历记录制度
- 临床五维度高级健康评估下青少年抑郁症药物中毒的护理个案
- 设备租赁免责协议书
- 基于人工智能的小学数学教学针对学习困难学生的数学问题解决能力提升策略研究教学研究课题报告
- 地质调查员(地质灾害方向)职业技能竞赛模拟试卷及答案
- 内科学(肾脏-内分泌-血液)温州医科大学知到智慧树网课答案
- (正式版)DB54∕T 0429-2025 《河湖岸线保护与利用规划编制规程》
- 2026国家能源投资集团直招(983人)笔试参考题库附答案解析
评论
0/150
提交评论