全排列
给定n个元素的{1,2,3,4,5,...,n}的序列,我们想产生该序列的所有排列(Permutation).对于n个元素的排列,一共有n!种。 那怎么设计算法?
试试递归。
1 初始条件条件,当元素只有一个的时候,全排列很简单的产生。
2 怎么派生出小规模的同种类型的问题,将序列逐次按1的步长减小。比如 perm(m) 里面求perm(m+1) (注:n 为元素下标 m>=0并 m<n ,依次下去,元素m-元素n之间的
个 数越来越小) 。
具体实施步骤
固定位置找元素
最关键的步骤
也是就是说,如果我们能求出n-1个元素的全排列
求出元素2,3,。。。。。,n的全排列 ,将元素1放到最前面
求出元素1,3,。。。。。,n的全排列,将元素2 放到最前面
以此循环得到序列n的全排列.
这里面需要注意的问题,为了使全排列 序列不重复,每产生一次序列,需要将原来位置上的元素给换回来。
相应的伪代码如下
//arry[] n 序列n
//m 游标
// length 数组长度
perm(arry[] n,m,length)
{
if m=lenght -1 then print(n); return;
else
for(int j=m ;j<length;j++)
{
n[j] 与n[m] 互换;
perm(arry[] n,j,length);
n[j] 与n[m] 互换;
}
return;
}