输出 0----N 的全排列

13 篇文章 0 订阅

  对于这种全排列我们首先思考是将其中的一个固定住后边的进行变化,再将其中的两个定住后边的变化直接到没有数据,之后再将第二个和第一个交换第二个作为第一个,再重复这个变化,直到所有的数据都成为过第一个

来点实际的例子 比如 对于“abc”这三个字母的全排列: 首先将a固定住 bc进行变化   就是 abc   acb   之后恢复原来的abc    再将a和b交换    就是 bac   bca 之后恢复原来的abc  下来再将c与a交换 就是cab cba 总共6次全排列


比如   实现简单代码是

      void Permutations(char *arr ,int l, int r)  //对于 abc 来说 l=0  r = 3;  char arr[]="abc"

             {

               swap(arr[0],arr[0]); //交换aa

                Permutations(arr,0,3);

                swap(arr[0],arr[0]);//还原aa


                 swap(arr[0],arr[1]); //交换ab

                Permutations(arr,1,3);

                swap(arr[0],arr[1]); //还原ab


                 swap(arr[0],arr[2]); //交换ac

                Permutations(arr,1,3);

                swap(arr[0],arr[2]); //还原ac


            }


具体的还要考虑递归的边界条件和返回

具体代码在底下:


void Permutations(char *p ,int l, int r)
{
	if (p== NULL)
	{
		return;
	}
	if (l == r)
	{
		for (int j = 0; j <r; ++j)
		{
			std::cout << p[j] << " ";
			
		}
		std::cout << "\n";
	}
	else
	{
		for (int i = l; i < r; ++i)
		{
			std::swap(p[l], p[i]);
			Permutations(p, l + 1, r);
			std::swap(p[l], p[i]);
		}
	}
}


int main(void) 
{
	char arr[] = "01235";
	Permutations(arr, 0,5); //排列的个数是数字个数的阶乘这里是5!

	getchar(); 
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值