目录
一.全排列概念
从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]);
}
}
}
如果需要分析过程,用层次法分析