STL:next_permutation算法

本文详细介绍了C++ STL中的next_permutation和prev_permutation算法,用于生成序列的不同排列。这两种算法分别用于生成序列的下一个和上一个排列。文章通过代码解释了next_permutation的实现原理,包括寻找相邻元素、交换位置和逆转部分序列的过程。同时,提供了一个自定义的next_permutation模板函数实现示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


什么是全排列呢?

全排列是从N个元素中取出M个元素,并按照一定的规则将取出元素排序,我们称之为从N个元素中取出M个元素的一个排列,当M=N时,即从N个元素中取出N个元素的排列。

比如:A={a,b,c};
这个序列的全排列为:
A1={a,b,c}, A2={a,c,b}, A3={b,a,c}, A4={b,c,a}, A5={c,a,b}, A6={c,b,a}

1.概念概述:

C++的STL容器中提供了两种全排列算法,用于指定序列生成不同的排列

1.1“下一个”排列组合

next_permutation(begin,end);
按照变量顺序生成给定序列的下一个较大序列,比如给定“abc”,那么next_permutation(begin,end)就会生成下一个较大的序列“acb”。
bool next_permutation(begin,end);标示下一个排列组合,如果没有下一个排列组合,就返回false,否则执行完相关算法之后返回true。

1.2"前一个"排列组合

prev_permutation(begin,end);
与next_permutation(begin,end)原理相同,顺序相反。

2.算法原理:

这里以bool next_permutation(begin,end)为例说明其原理,bool next_permutation(begin,end);原理相同,顺序反之。
①从这个序列的最后一个位置开始寻找两个相邻的元素,在这两个元素中,前一个元素(记为i)<后一个元素(记为j)。
②再从这个序列的末尾找到第一个比i大的元素(记为t),然后交换i和t的位置。
③将j(包括j在内)之后的元素进行逆置。
这是一轮下来的思路原理。
如下图:
第一轮:
在这里插入图片描述第二轮:
在这里插入图片描述

后面依次类推。

3.代码实现:

//自己定义
template<class T>
bool nextpermutation(T first, T last)
{
	//空区间
	if (first == last)
	{
		return false;
	}
	T i = first;
	i++;
	//只有一个元素
	if (i == last)
	{
		return false;
	}
	//i指向尾端
	i = last;
	--i;
	while (1)//死循环
	{
		T j = i;//倒数第一个
		--i;//倒数第二个
		if (*i < *j)//前一个元素小于后一个元素
		{
			//从尾部开始寻找第一个比i大的元素,进行交换
			T t = last-1;
			while (*i >= *t)
			{
				--t;
			}
			//交换i,t
			iter_swap(i, t);
			//j以及j之后的元素进行逆转
			reverse(j, last);
			return true;
		}
		//已经到第一个了
		if (i == first)
		{
			reverse(i, last);
			return false;
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

仟各

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值