关于全排列算法(支持有重复的数字的情况)

本文介绍了一种求解全排列问题的方法,针对包含重复数字的情况。通过从一个排列找到下一个排列的逻辑,从初始排列123456789开始,不断迭代直到得到987654321,从而获取所有可能的排列。算法通过找到第一个比其右边小的数,然后与其右边最小的大于它的数交换,并反转交换后的子序列来生成下一个排列。
摘要由CSDN通过智能技术生成

对于求一个全排列的问题,我们不可能一下子列出所有排列的情况(n!种情况),
我们可以从一个已知的排列,来获得下一个排列。对于任意的一个排列,他的下一个排列是什么了?
比如说:
453987621,我的想法是:
从该排列的右边向左边遍历,找到第一个比其右边小的数,此处是

33<9),然后遍历3右边的数字,找到比他大的最小的数字,此处为6
36交换,排列变为456987321,最后将6
后面的数字逆序即可,(987321变成123789),所以得到的下一个
排列为
456123789
开始时我们初始化为
123456789,最后判断得到987654321的排列,则得到了所有的全排列。
代码如下:


#include  < iostream >
using   namespace  std;
void  init( int   * a, int  n);
void  _swap( int   & i, int   & j);
void  inverse( int   * a, int  startpos, int  n);
int  main( int )
{
    
int a[100= 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值