STL -------- 全排列算法非递归

更多C++知识:C++目录索引


全排列:

输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。

思路:

全排列思想主要分为三部分:

  1. 从右向左找出第一对右大于左的字符对
  2. 从右向左找第一个大于左边字符大的字符,进行交换
  3. 找出需要逆置的区间

下面看一个例子:字符串为1 2 3

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

至此,1作为第一个元素的情况已经排列完毕,接下来排列2作为首元素的情况

这里写图片描述

这里写图片描述

这里写图片描述

剩下的情况重复上面的步骤,不在画图,下面看代码

bool perm(vector<int>& v)
{
	int length = v.size();//数组长度
	vector<int>::iterator left = v.end();
	--left;//指向倒数第二个
	vector<int>::iterator right = left;
	--left;//指向倒数第一个数字

	//找出第一对左小右大的数
	while (right != v.begin() && *left >= *right)
	{
		if (--right != v.begin())
		{
			--left;
		}
	}

	if (right == v.begin())//当right走到最开始的位置,表示全部已经排完,不需要在进行排列
	{
		reverse(right, v.end());
		return false;
	}

	vector<int>::iterator last = v.end() - 1;//指向最后一个数
	while (*last <= *left)//找出从右往左第一个比left大的数字
	{
		--last;
	}

	swap(*left, *last);//将last和left进行交换
	reverse(right, v.end());//在将right往后的数据进行逆置

	

	return true;
}
void Print(vector<int>& v)
{
	vector<int>::iterator it1 = v.begin();
	while (it1 != v.end())
	{
		cout << *it1 << " ";
		++it1;
	}
	cout << endl;

}
void test()
{
	vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);
	BDIterator first = v.begin();
	BDIterator last = v.end();
	do
	{
		Print(v);

	} while (perm(v));
}

结果:

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值