算法分析|全排列

目录

 

一.全排列概念

二.思路分析

三.代码


一.全排列概念

从m个元素中取出n(n<=m)个元素进行排列,不同顺序是一种排列,当m=n时称为全排列

 

例如:R={1,2,3}

          R1=R-{r1}={1,2}

         perm(R)----->1     2      3                                           (0)perm(R)------>0  1  2  3

                              1     3      2                                                                      0   1  3  2

                              2     3      1                                                                      0    2  3  1

                              2     1      3                                                                      0    2  1  3

                              3     1      2                                                                       0   3   1  2

                              3      2     1                                                                       0   3  2  1

二.思路分析

假设R={1,2,3}

  • 逻辑概念图:

  •  物理概念图:

 分析时按层次分析

       1.让j = k,让j与k的值交换,形成一个分支,再将k与j的值交换回来;将j+1的值与k值交换,又形成一个分支,形成后再交换回来,依次类推,直到j>n(数组的规模长度)停止。由此形成了第二层。  

     2.每往下深入一层k+1,执行方法与第一层类似,直到k==m时,不在形成下一层。

代码执行时按深度执行:

三.代码

void perm(int *arr,int k,int m)//k和m表示数组的区域
{
	if(k==m)//表示需排序的区域中只有一个元素
	{
		for(int i=0;i<=m;++i)
		{
			cout<<arr[i]<<" ";
		}
		cout<<endl;
	}
	else
	{
		for(int j=k;j<=m;++j)
		{
			swap(arr[j],arr[k]);//交换后需要交换回来
			perm(arr,k+1,m);
			swap(arr[j],arr[k]);
		}
	}
}

   如果需要分析过程,用层次法分析

 

  

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值