(一)非递归全排列算法
基本思想是:
1.找到所有排列中最小的一个排列P.
2.找到刚刚好比P大比其它都小的排列Q,
3.循环执行第二步,直到找到一个最大的排列,算法结束.
下面用数学的方法描述:
给定已知序列 P = A1A2A3An ( Ai!=Aj , (1<=i<=n , 1<=j<=n, i != j ) )
找到P的一个最小排列Pmin = P1P2P3Pn 有 Pi > P(i-1) (1 < i <= n)
从Pmin开始,总是目前得到的最大的排列为输入,得到下一个排列.
方法为:
1.从低位到高位(从后向前),找出“不符合趋势”的数字。即找到一个Pi,使Pi < P(i+1)。
若找不到这样的pi,说明我们已经找到最后一个全排列,可以返回了。
2.在 P(i+1)P(i+2)Pn 中,找到一个Pj,便得 Pj"刚刚好大于"Pi.
("刚刚好大于"的意思是:在 P(i+1)P(i+2)Pn 中所有大于Pi的元素构成的集合中最小的元素.)
3.交换 Pi , Pj 的位置.注意:此处不改变i和j的值,改变的是Pi和Pj.
4.交换后, P1P2P3Pn 并不是准确的后一个排列。因为根据第1步的查找,我们有P(i+1) > P(i+2) > . > Pn
即使进行了Pi和Pj的交换,这仍然是这一部分最大的一个排列。将此排列逆序倒置(变成最小的排列)即为所求的下一个排列.
5.重复步骤1-4,直到步骤1中找不到“不符合趋势”的数字.
复制代码 代码如下:
//交换数组a中下标为i和j的两个元素的值
void swap(int* a,int i,int j)
{
a[i]^=a[j];
a[j]^=a[i];
a[i]^=a[j];
}
//将数组a中的下标i到下标j之间的所有元素逆序倒置
void reverse(int a[],int i,int j)
{
for(;i<j;++i,--j)
{
swap(a,i,j);
}
}
void print(int a[],int length)
{
for(int i=0;i<length;++i)
cout<<a[i]<<" ";
cout<<endl;
}
//求取全排列,打印结果
void combination(int a[],int length)
{
if(length<2) return;
bool end=false;
while(true)
{
print(a,length);
int i,j;
//找到不符合趋势的元素的下标i
for(i=length-2;i>=0;--i)
{
if(a[i]<a[i+1]) break;
else if(i==0) return;
}
for(j=length-1;j>i;--j)
{
if(a[j]>a[i]) break;
}
swap(a,i,j);
reverse(a,i+1,length-1);
}
}
(二)递归算法
令E= {e1 , ..., en }表示n 个元素的集合,我们的目标是生成该集合的所有排列方式。令Ei 为E中移去元素i 以后所获得的集合,perm (X) 表示集合X 中元素的排列方式,ei . p e r m(X)表示在perm (X) 中的每个排列方式的前面均加上ei 以后所得到的排列方式。例如,如果E= {a, b, c},那么E1= {b, c},perm (E1 ) = ( b c, c b),e1 .perm (E1) = (a b c, a c b)。对于递归的基本部分,采用n = 1。当只有一个元素时,只可能产生一种排列方式,所以perm (E) = ( e),其中e 是E 中的唯一元素。当n > 1时,perm (E) = e1 .perm (E1 ) +e2 .p e r m(E2 ) +e3.perm (E3) + ⋯ +en .perm (En )。这种递归定义形式是采用n 个perm (X) 来定义perm (E), 其中每个X 包含n- 1个元素。至此,一个完整的递归定义所需要的基本部分和递归部分都已完成。
当n= 3并且E=(a, b, c)时,按照前面的递归定义可得perm (E) =a.perm ( {b, c} ) +b.perm ( {a,c} ) +c.perm ( {a, b} )。同样,按照递归定义有perm ( {b, c} ) =b.perm ( {c} ) +c.perm ( {b}), 所以a.perm ( {b, c} ) = ab.perm ( {c} ) + ac.perm ( {b}) = a b . c + ac.b = (a b c, a c b)。同理可得b.perm ( {a, c}) = ba.perm ( {c}) + bc.perm ( {a}) = b a . c + b c . a = (b a c, b c a),c.perm ( {a, b}) =ca.perm ( {b}) + cb.perm ( {a}) = c a . b + c b . a = (c a b, c b a)。所以perm (E) = (a b c, a c b, b a c, b c a,c a b, c b a)。注意a.perm ( {b, c} )实际上包含两个排列方式:abc 和a c b,a 是它们的前缀,perm ( {b, c} )是它们的后缀。同样地,ac.perm ( {b}) 表示前缀为a c、后缀为perm ( {b}) 的排列方式。程序1 - 1 0把上述perm (E) 的递归定义转变成一个C++ 函数,这段代码输出所有前缀为l i s t [ 0:k-1], 后缀为l i s t [ k:m] 的排列方式。调用Perm(list, 0, n-1) 将得到list[0: n-1] 的所有n! 个排列方式,在该调用中,k=0, m= n - 1,因此排列方式的前缀为空,后缀为list[0: n-1] 产生的所有排列方式。当k =m 时,仅有一个后缀l i s t [ m ],因此list[0: m] 即是所要产生的输出。当k<m时,先用list[k] 与l i s t [ k:m] 中的每个元素进行交换,然后产生list[k+1: m] 的所有排列方式,并用它作为list[0: k] 的后缀。S w a p是一个inline 函数,它被用来交换两个变量的值
复制代码 代码如下:
template <class T>
inline void Swap(T& a, T& b)
{
// 交换a和b
T temp = a; a = b; b = temp;
}
template<class T>
void Perm(T list[], int k, int m)
{
//生成list [k:m ]的所有排列方式
int i;
if (k == m)
{
//输出一个排列方式
for (i = 0; i <= m; i++)
cout << list [i];
cout << endl;
}
else // list[k:m ]有多个排列方式
{
// 递归地产生这些排列方式
for (i=k; i <= m; i++)
{
Swap (list[k], list[i]);
Perm (list, k+1, m);
Swap (list [k], list [i]);
}
}
}
相关推荐:
SEO关键词是什么意思?全面解析SEO关键字的核心作用,华为ai音箱 百度ai音箱
如何用AI写公众号文章?让创作更高效、更轻松
SEO目标:让您的网站轻松登顶搜索引擎,优化购物网站的搜索
AI工具,让工作效率翻倍:AI工具教程全面解析
SEO检测,让网站排名飞升的秘密武器,高端快消食品营销推广
今时CMS:引领数字化转型的智慧之选,河南seo优化网站联系方式
ChatGPT故障:科技背后的秘密与应对策略,华为什么手机带ai功能
seo重点是什么,seo最重要的指标 ,ai网格怎么用
seo要寻找什么资源,怎么找seo ,ai插画描边
SEO武汉:如何提升武汉地区网站的搜索引擎排名,景区网站建设费用
互联网留痕:数字时代的隐形轨迹与自我管理,灯塔网站推广包年多少钱
2025百度收录优化:提升网站排名,助力企业数字化转型,第一ai做
ChatGPT破解版电脑:如何获得更强大的AI助手,提升工作与学习效率,ai预设动画
seo黑帽是什么,列举几种seo黑帽行为 ,穿老款的ai丢人吗
AI免费生成文本,内容创作新篇章
seo深度优化插件是什么,深度优化手机软件 ,ai的缩写
seo需要做些什么,做seo的 ,超级ai地图
seo管理系统是什么,seo网站管理 ,过度圆ai
优化入口:提升网站流量与转化率的秘密武器,琼海关键词排名品牌
ZBlog:开启你的个人网站新时代,轻松搭建与管理,二手手机营销推广方案
AI人工智能:改变未来的科技革命
SEO优化大全:让你的网站排名轻松破局,精准引流更高效!,274357524ai
什么是seo如何进行seo,何谓seo ,红米的AI摄影什么意思
优化标题:如何让你的文章更具吸引力与点击力,整站网站优化解决方案
AI智能工具的无限可能:未来已来,你准备好了吗?
SEO需要什么语音,seo需要考虑什么 ,学生作业ai
SEO元素-提升网站排名的核心要素,推广分成网站有哪些
SEO观看:如何通过优化提升您的网站流量和品牌影响力,龙里网络营销推广
SEM有哪几个平台?数字营销的多元选择,AI怎么取消移动间距
ChatGPT崩了?用户称打开是一片空白,真相竟然如此!,zzz*明星AI换脸
SEO全套秘籍:提升网站流量与排名的终极指南,荣昌手机网站建设
SEO搜外:全球搜索引擎优化的秘密武器,如何选择网站建设类型呢
亚马逊产品seo什么意思,亚马逊平台产品专业术语 ,小新同学ai
SEO快速优化文章排名:提升网站流量的必备技巧,ai小苹果会员分享
“曝光量扩大,助力品牌腾飞的秘密武器”,盐山网站优化免费咨询
ChatGPT为什么网址打不开?原因分析与解决方法,文档审核ai
ChatGPT遇到问题?如何解决“您的应用遇到问题,无法正常启动”困境?,ai下载增强版
GPT-3.5免费吗?揭秘AI智能助手的未来与收费模式,ai 美美
360排名优化价格:打造高效网络营销的制胜法宝,ai换脸刘浩存自wei
自动写文章的AI,提升效率的创作利器
SEO优化是做什么的?让你的网站流量飙升的秘密武器,乳腺癌ai作用机理
SEO分类:从基础到进阶,全面解析SEO优化的关键要素,新建设网站排名
ChatGPT空白对话:释放创意,开启智能对话的新世界,ai重庆南坪
ChatGPT为什么打不开了?揭秘背后的原因与解决办法,ai业务后端
AI做文章:引领智能创作的未来
SEO架构:提升网站流量的核心策略,东营南江全平台营销推广
洗文章AI:让内容创作变得更智能、更高效
用AI生成文章,让创作更简单高效
AI缩写在线:让人工智能助力你行业前沿技术,ai uhrehara
SEO详解:如何优化你的网站提升排名,获得更多流量,伊春湖南网站优化推广