【STL源码剖析读书笔记】【第6章】算法之next_permutation和prev_permutation算法

本文详细解析了C++标准库中next_permutation与prev_permutation函数的工作机制,包括它们如何生成序列的下一个和上一个排列组合,并提供了源代码分析。通过实例讲解,帮助开发者掌握这两个函数的应用场景。
摘要由CSDN通过智能技术生成

1、next_permutation()会取得[first, last)所标示序列的下一个排列组合,如果没有下一个排列组合,返回false,否则返回true。

2、next_permutation()函数算法原理:从最尾端开始寻找两个相邻的元素,令第一个元素是*i,第二个元素是*ii,且满足*i < *ii,找到这样一组元素后,再从尾端开始往前找出第一个大于*i的元素*j,将i、j元素对调,然后将ii之后的所有元素逆序排列,就得到了下一个组合。

3、next_permutation()源代码

template <class BidirectionalIterator>
bool next_permutation(BidirectionalIterator first,
	BidirectionalIterator last) {
	if (first == last) return false;  //空区间
	BidirectionalIterator i = first;
	++i;
	if (i == last) return false;   //只有一个元素
	i = last;//i指向尾端
	--i;
	for (;;) {
		BidirectionalIterator ii = i;
		--i;
		if (*i < *ii) {//前一个元素小于后一个元素
			BidirectionalIterator j = last;//令j指向尾端
			while (!(*i < *--j));//由尾端向前找,直到遇上比*i大的元素
			iter_swap(i, j);//交换i,j
			reverse(ii, last);//将ii之后的元素全部逆向重排
			return true;
		}
		if (i == first) {    // 进行至最前面了
			reverse(first, last);//全部逆向重排
			return false;
		}
	}
}

4、prev_permutation()会取得[first, last)所标示序列的上一个排列组合,如果没有上一个排列组合,返回false,否则返回true。

5、prev_permutation()函数算法原理:从最尾端开始寻找两个相邻的元素,令第一个元素是*i,第二个元素是*ii,且满足*i > *ii,找到这样一组元素后,再从尾端开始往前找出第一个小于*i的元素*j,将i、j元素对调,然后将ii之后的所有元素逆序排列,就得到了上一个组合。

6、prev_permutation()源代码

template <class BidirectionalIterator>
bool prev_permutation(BidirectionalIterator first,
	BidirectionalIterator last) {
	if (first == last) return false; //空区间
	BidirectionalIterator i = first;
	++i;
	if (i == last) return false; //只有一个元素
	i = last;//i指向尾端
	--i;

	for (;;) {
		BidirectionalIterator ii = i;
		--i;
		if (*ii < *i) {//后一个元素小于前一个元素
			BidirectionalIterator j = last;//令j指向尾端
			while (!(*--j < *i));//由尾端向前找,直到遇上比*i小的元素
			iter_swap(i, j);//交换i,j
			reverse(ii, last); // 将ii之后的元素全部逆向重排
			return true;
		}
		if (i == first) {    // 进行至最前面了
			reverse(first, last);//全部逆向重排
			return false;
		}
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值