1. 定义
nnn个元素的全排列有n!n!n!个,如果将排列按顺序编号,并能够按照某种方法建立起每一个序号与一个排列之间的对应关系,那么就可以根据序号确定排列,反过来也可以根据排列确定它的序号。根据排列的序号生成对应排列的方法就称为序数法。
n!=n(n−1)!=[(n−1)+1](n−1)!=(n−1)(n−1)!+(n−1)!
\begin{aligned} n ! &=n(n-1) !=[(n-1)+1](n-1) ! \\ &=(n-1)(n-1) !+(n-1) ! \end{aligned}
n!=n(n−1)!=[(n−1)+1](n−1)!=(n−1)(n−1)!+(n−1)!
同理可得
(n−1)!=(n−2)(n−2)!+(n−2)!
(n-1) !=(n-2)(n-2) !+(n-2) !
(n−1)!=(n−2)(n−2)!+(n−2)!
代入上式可得
n!=(n−1)(n−1)!+(n−2)(n−2)!+(n−2)!=(n−1)(n−1)!+(n−2)(n−2)!+(n−3)(n−3)!+⋯+2⋅2!+2!=∑k=1n−1k⋅k!+1
\begin{aligned} n ! &=(n-1)(n-1) !+(n-2)(n-2) !+(n-2) ! \\ &=(n-1)(n-1) !+(n-2)(n-2) !+(n-3)(n-3) !+\cdots+2 \cdot 2 !+2 ! \\ &=\sum_{k=1}^{n-1} k \cdot k !+1 \end{aligned}
n!=(n−1)(n−1)!+(n−2)(n−2)!+(n−2)!=(n−1)(n−1)!+(n−2)(n−2)!+(n−3)(n−3)!+⋯+2⋅2!+2!=k=1∑n−1k⋅k!+1
上式减1得
n!−1=(n−1)(n−1)!+(n−2)(n−2)!+⋯+2⋅2!+1⋅1!
n !-1=(n-1)(n-1) !+(n-2)(n-2) !+\cdots+2 \cdot 2 !+1 \cdot 1 !
n!−1=(n−1)(n−1)!+(n−2)(n−2)!+⋯+2⋅2!+1⋅1!
可得到000到n!−1n!-1n!−1的整数m可以唯一地表示为
m=ak−1(k−1)!+ak−2(k−2)!+⋯+a2⋅2!+a1
m=a_{k-1}(k-1) !+a_{k-2}(k-2) !+\cdots+a_{2} \cdot 2 !+a_{1}
m=ak−1(k−1)!+ak−2(k−2)!+⋯+a2⋅2!+a1
其中aia_iai满足0⩽ai⩽k,i=1,2,⋯ ,k−10 \leqslant a_{i} \leqslant k, i=1,2, \cdots, k-10⩽ai⩽k,i=1,2,⋯,k−1
所以可以证明000到n!−1n!-1n!−1的n!n!n!个整数和序数(an−1,an−2,⋯ ,a2,a1)\left(a_{n-1}, a_{n-2}, \cdots, a_{2}, a_{1}\right)(an−1,an−2,⋯,a2,a1)一一对应。
2. 序数法生成全排列算法
由排列P1P2P3…PnP_1P_2P_3\dots P_nP1P2P3…Pn对应的序数(an−1an−2…a1)(a_{n-1}a_{n-2}\dots a_1)(an−1an−2…a1)的规则为:
aia_iai = i+1i+1i+1的右边比i+1i+1i+1小的数字的个数
-
例1:由排列数确定排列的序号
以1,2,3,4的排列4213为例,排列4213为例,排列4213,4的右边比它小的数有3位,故a3=3a_3=3a3=3;3的右边比3小的数为0,故a2=0a_2=0a2=0,2的右方比2小的数为1,故a1=1a_1=1a1=1,故排列4213对应的序数为(301)。 -
例2:由排列的序号确定排列数
承接上一个例子,a3=3a_3 = 3a3=3,故4在排列中所在的位右方小的数有3个,故在排列数中的第一位为4。a2=0a_2=0a2=0,故3的右方没有比它小的,故在排列数中的第四位上,以此类推,得到最终的排列数为4213。 -
例3:n=4n=4n=4的序数(a3a2a1)(a_3a_2a_1)(a3a2a1)与对应的排列