使用set实现的一种简单的全排列算法(C++语言)

本文介绍了使用C++和set容器实现全排列算法的思路。通过递归方式,选取一个元素作为已排列部分,对剩余元素继续进行相同操作,直至只剩一个元素。文章详细讲解了算法实现,并提供了集合类和主程序的代码片段。
摘要由CSDN通过智能技术生成

本算法的思想十分简单。

1.如求(1,2,3)的排列,程序按如下方式分解:

    要求(123)的全排列就是求1(23)、2(13)、3(12)的全排列,而1(23)又可看做是求12(3)、13(2)的全排列。所以程序整体的思想就是每次先从待排列元素中取出一个元素tmp= findfirst()作为已排列元素,然后对剩下的待排列元素继续执行此过程,直到待排列元素只剩下一个迭代结束。然后需要恢复本次迭代之前选择第一个元素时的原排列,比如当选择到12(3)时,恢复到上一级就是1(23)。然后对(23)执行tmp=findnext(tmp),即返回待排序元素中的tmp=2之后的一个元素,在这里就是3,所以下次状态就是:13(2)。

2.程序中真正使用到的排序算法只有18行,主要是因为在程序中定义了一个集合类,在集合类中封装有set容器,在其中存放待排列的元素,类中主要方法包括:

(1)const Comparable & findFirst()   		//返回容器a中的第一个元素
(2)const Comparable & findNext(Comparable &tmp)	//返回元素tmp之后的下一个元素
(3)void insert(const Comparable &value)		//向a中插入元素value
(4)Union & erase(const Comparable &value)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值