邻位互换生成全排列算法

本文详细探讨了如何使用邻位互换方法来生成所有可能的全排列。通过这种算法,可以系统地遍历一个给定大小的数组的所有不同排列。文章深入解析了算法的逻辑和步骤,并提供了运行实例展示其效果。

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

/**
	本算法的思想也是希望以(12…n)作为n个元素1,2,…,n的第一个排列,
	然后按照某种方法,由一个排列(p)=(p1p2…pn)直接生成下一个排列,
	直到全部排列生成完毕为止。
	
	以n=4为例,开始在排列1234的各数上方加一个左箭头“←”,
	当一个数上方箭头所指的一侧,相邻的数比该数小时,便称该数处于活动状态。


	从排列(p)=(p1p2…pn)生成下一个排列的算法如下:
	(1)若排列(p)=(p1p2…pn)中无一数处于活动状态,则停止,否则转(2);
	(2)求所有处于活动状态的数中的最大者,设为k,
		k和它的箭头所指的一侧的相邻数互换位置,转(3);
	(3)令比k大的所有数的箭头改变方向,转(1)。


*/
#include <iostream>


using namespace std;


enum DIR{LEFT=-1,RIGHT=1};


/*	函数功能:判断下标i所指p中元素是否处于活动状态
 *	输入参数:p	in,指向n个字符的一个当前排列
 *			dir	in,标记p中每个元素的箭头方向
 *			i	in,待判定元素的下标
 *			N	in,待排列字符的个数
 *	返回值:	true 表示待判定元素为活动状态,
 *			false 表示待判定元素处于非活动状态
 */
bool IsActive(const char *p,const DIR *dir,const int i,const int N)
{
	if(i+dir[i] < 0 || i+dir[i] >= N)
		return false;
	if(p[i+dir[i]] < p[i])	//箭头所指一侧相邻的数比该数小
		return true;
	else return false;
}


/*	函数功能:找到p中处于活动状态的数中的最大者
 *	输入参数:p	in,指向n个字符的一个当前排列
 *			dir in,标记p中每个元素的箭头方向
 *			N	in,待排列字符的个数
 *	返回值:上述最大者的下标,-1表示调用参数有误,N表示没有活动者
 */
int MaxActive(const char *p,const 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值