有几种典型的排列算法,这些算法效果都很好,在实际应用中有着广泛的价值。
这些方法有:序数法、字典序法、邻位互换法。
1.4.1 序数法
序数法是基于一一对应概念,先在排列和一种特殊的序列之间建立一种一一对应关系,然后再给出由序列产生排列的方法,因为序列的产生非常方便,这样就可以得到一种利用序列来生成排列的方法。
例如十进制数可以表示为:
可以证明从0到n!-1之间的任何整数m都可唯一地表示为:
m=an-1(n-1)! + an-2(n-2)! + ~~ +a2*2! + a1*1!
其中0<=ai<=i ,I=1,2,~~,n-1
例如:
10=1*3!+2*2!+0*1!
4000=5*6!+3*5!+1*4!+2*3!+2*2!+0*1!
那么ai是如何求出来的呢?
就以4000为例子:
n1=4000
n2=[n1/2]=2000 a1=0(4000%2)
n3=[n2/3]=666 a2=2(2000%3)
n4=[n3/4]=166 a3=2(666%4)
n5=[n4/5]=33 a4=1(166%5)
n6=[n5/6]=5. a5=3(33%6)
n7=[n6/7]=0 a6=5(5%7)
1.4.2 字典序法
对给定的字符集中的字符规定了一个先后关系,在此基础上规定两个全排列的先后是从左到右逐个比较对应的字符的先后。
字典序法就是按照字典排列的思想逐一产生所有排列。
字例子:符集{1,2,3},较小的数字位置较先,这样按字典序生成的全排列是:123,132,213,231,312,321
1.4.3 邻位互换法
邻位互换生成算法的思想是很自然的一种想法,其中蕴涵递归的思想。此算法是由Johnson Trotter 首先提出的。
通过把n插入到n-1阶排列的不同位置得到n阶排列
n=1:1
n=2:12,21
n=3:123,132,312;321,231,213
用这种方法可以产生任意n阶排列。
为了产生n阶排列,必须知道所有n-1阶排列,如果从算法的角度考虑,必须储存所有n-1阶排列,然后才能产生所有n阶排列。这是该算法的一个很大的缺点。