(1)序数法:
因为: (2)字典序法:
n!=((n-1)+1)(n-1)!=(n-1)(n-1)!+(n-1)!,
同理,
(n-1)!=(n-2)(n-2)!+(n-2)!,
…,
故 n!= (n-1)(n-1)!+ (n-2)(n-2)!+…+2*2!+2!
不难证明,从0到n!-1的任何数m可唯一的表示为 m=an-1(n-1)!+ an-2(n-2)!+…+a11!, 其中
0< ai< i.
生成给定全排列的下一个排列
所谓一个的下一个就是这一个与
下一个之间没有其他的。这就要求这一个与下一个有尽可能长的共同前缀,也即变化限制在尽可能短的后缀上。
(3)换位法:
生成n!可以在生成(n-1)!的阶乘基础上,依次从最右端插入第n个数。
考虑{1,2…n}的一个排列,其上每一个整数都给了一个方向,我们称整数k是可移的(Mobile&Active),如果它的箭头所指的方向的邻点小于它本身。
于是,我们可由
按如下算法产生所有排列
算法
1,开始时:
2,当存在可移数时
算法如下:
m=m1, 0≤ m ≤n!-1
m1=2m2+k1, 0≤ k1 ≤1
m2=3m3+ k2, 0≤ k2 ≤2
…………….
mn-2=(n-1)mn-1+ kn-2, 0≤ kn-2 ≤n-2
mn-1= kn-1, 0≤ kn-1 ≤n-1
(kn-1 … k2k1) ←→ m