- 1、本文档共18页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第一次看到这个算法是在软件设计师的辅导书上。代码如下,在VC++ 7.0下调试通过。//?Permutation.cpp : 定义控制台应用程序的入口点。?//?//N个数全排列的非递归算法?#include “stdafx.h”?void?swap(int?a,?int?b)?{?int?temp;?temp?=?a;?a?=?b;?b?=?temp;?}?/*?根据当前的排列p,计算下一个排列。?原则是从1234–4321,若p已经是最后一个排列,传回false,否则传回true。?p是一个n维向量。?*/?bool?nextPermutation(int?*p,?int?n)?{?int?last?=?n –?1;?int?i, j, k;?//从后向前查找,看有没有后面的数大于前面的数的情况,若有则停在后一个数的位置。?i?=?last;?while?(i??0??p[i]??p[i?-?1])?i–;?//若没有后面的数大于前面的数的情况,说明已经到了最后一个排列,返回false。?if?(i?==?0)?return?false;?//从后查到i,查找大于p[i - 1]的最小的数,记入k?k?=?i;?for?(j?=?last; j?=?i; j–)?if?(p[j]??p[i?-?1]??p[j]??p[k])?k?=?j;?//交换p[k]和p[i - 1]?swap(p[k], p[i?-?1]);?//倒置p[last]到p[i]?for?(j?=?last, k?=?i; j??k; j–, k++)?swap(p[j], p[k]);?return?true;?}?//显示一个排列?void?showPermutation(int?*p,?int?n)?{?for?(int?i?=?0; i??n; i++)?cout??p[i];?}?int?_tmain(int?argc, _TCHAR?*argv[])?{?int?n;?int?*p;?cin??n;?p?=?new?anint[n];?for?(int?i?=?0; i??n; i++)?p[i]?=?i?+?1;?showPermutation(p, n);?cout??endl;?while(nextPermutation(p, n))?{?showPermutation(p, n);?cout??endl;?}?delete[] p;?system(“pause”);?return?0;?}这个算法挺难理解的。这里试图说明一下算法的意思。主要的任务在nextPermuation()中完成。这其中的思想是,提供一个已经有的全排列P,求出P的“下一个”全排列。这里“下一个”的意思是说,在n个数的n!个全排列在数字上从小到大的一个序列中,p的下一个数字上比它大的一个排列。那么由此,提供一个初始的n个数的全排列P1 = p1p2…pn,有pi pi – 1(1 i n – 1),反复运行nextPermuation()找出比P的“下一个”全排列,直到Pn! = p1’p2’…pn’,pi pi – 1(1 i n – 1)为止。所找到的所有的排列就是n的全排列。下面要考虑的问题,是如何从一个已知的排列P = p1p2…pn,找到它的下一个排列Q = q1q2…qn。我们要让排列从小到大生成,简单说,要让排列的趋势从p1p2…pn,pi pi – 1(1 i n – 1),到p1’p2’…pn’,pi pi – 1(1 i n – 1)。因此:1. ? ? ? ? ?从低位到高位(从后向前),找出“不符合趋势”的数字。即找到一个pi,使pi – 1 pi。若找不到这样的pi,说明我们已经找到最后一个全排列,可以返回了。2. ? ? ? ? ?把pi - 1替换成从pn到pi几个数字中“刚刚好大于pi-1”的数字。这里的目的是找出准确的P的下一个排列Q。所谓“刚刚好大于”,我们就查找从pi到pn中大于pi-1的最小的数字。然后将找到的数字与pi-1交换。3. ? ? ? ? ?还没有结束。交换后,pi-1pi…pn并不是准确的后一个排列。因为根据第一步的查找,我们有pi pi+1 … pn,否则查找在i~n就会停下来了。这样的一个排列显然不是最小的。实际上,原来的pi…pn,已经是这一部分最大的一个排列了。但我们现在换了最高位pi-1,因此要让后面的数字变的最小。方法很简单,根据上面的推理,我们只须将pi~pn的数列倒置即可(最大的排列倒置就变成了最小的排列)。这样,我们计算出了准确的下一个排列。比如有(1,2,3,4)这样一组数1.先分成(1)和(2,3,4),然后对(2,3,4)全排列2.把(1)分别和(2,3
您可能关注的文档
- 全优农资市场室内看板.doc
- 全册词语列表MicrosoftWord文档.doc
- 全区首届大学生广告艺术大赛手册(各院校).doc
- 全古风文字关于江南.doc
- 全国22家第三方理财公司介绍.docx
- 全国60年详细人口数据统计.doc
- 全国中药材交易市场.doc
- 全国二级建造师报考条件二级建造师报考必看.docx
- 全国五大经典自行车骑行路线.doc
- 全国各地中央子午线.doc
- 七章货物的保险.pptx
- 三章国际间接投资.pptx
- 人性假设理论.pptx
- 外研高一英语必修三ModuleIntroduction汇总市公开课获奖课件省名师示范课获奖课件.pptx
- 月相成因优质获奖课件.pptx
- 小学二年级语文课件《狐假虎威》省名师优质课赛课获奖课件市赛课一等奖课件.pptx
- 养羊业概况专题知识讲座.pptx
- 微生物的实验室培养市公开课获奖课件省名师示范课获奖课件.pptx
- 人教版六年级下册式与方程整理与复习市公开课获奖课件省名师示范课获奖课件.pptx
- 必威体育精装版高中精品语文教学:第二单元-第7课-诗三首:涉江采芙蓉、-短歌行、归园田居市公开课获奖课件省名师.pptx
文档评论(0)