對於有限數列:
易知其共有 n! 個不同的排列。爲了在枚舉這些排列時不遺漏,需要定義一種遍歷規則,這種遍歷規則便稱爲計數法。
計數法可分爲兩類:樹圖法、逆序法。
中介數:
中介數記錄了一個排列的全部信息,根據中介數可以確定的寫出一個排列,一個排列也對應一個獨特的中介數。通過中介數的順序遍歷(+1)便可不遺漏地得到所有的排列。
因爲一個的數字的排列方式是唯一確定的,不需要中介數。故n個數的排列對應的中介數只有n-1位。
樹圖法
字典序法
中介數中的第i個數c1表示對應的排列中的第i個數字應該從剩下的數中取第i個(由小到大排序,從0開始編號)。如:
中介數:201
c1=2 表示排列的第一個數應取1,2,3,4中的3;
c2=0 表示排列的第二個數應取1,2,4中的1;
c3=1 表示排列的第三個數應取2,4中的4;
故中介數201對應的排列爲3142;
中位數數位 |
c1 |
c2 |
c3 |
進制 |
4 |
3 |
2 |
位權 |
3*2 |
2 |
1 |
鄰位對換法:
中介數的第i位決定了第i+1個數字在排列中的位置。中介數的該位對應的子樹在此層排序的奇偶性決定了第i+1個數字插入原序列的方向。例:
中介數:102
初始數列:1
c1=1 表示排列中數字2應該插入當前數列“從後向前數”(默認方向)的1號空擋;
當前數列:21
c2=0 表示排列中數字3應該插入當前數列“從前向後數”(因爲 c1=1 爲奇數)的0號空擋;
當前數列:321
c3=2 表示排列中數字4應該插入當前數列“從前向後數”(因爲 (c1c2)=1*3+0=3爲奇數)的2號空擋;
當前數列:3241
中位數數位 |
c1 |
c2 |
c3 |
進制 |
2 |
3 |
4 |
位權 |
3*4 |
4 |
1 |
逆序法:
逆序:以遞增數列作爲參照對象(逆序爲0),一個數列中若出現後面的數小於前面的數,則該數列的逆序數+1。如
1234的逆序數爲1(逆序對:32)
4312的逆序數爲5(逆序對:43,41,42,31,32)
對於數列
注意到,n在排列中的逆序數最多爲n-1;n-1在排列中的逆序數最多爲n-2;······;1在排列中的逆序數最多爲0
故將2至n共n-1個數字的逆序數記錄下來拼成一箇中介數時,該中介數各個位的取值範圍不同,即各位有不同的進制。由此產生了兩種中介數組織方式:由低位到高位進制遞增的稱爲“遞增進位制數法”;由低位到高位進制遞減的稱爲“遞減進位制數法”。
遞增進位制數法:
中介數的高位指示了待排數字中較大數的逆序數。例如:
中介數:201
c1=2 表示待排數字4的逆序數爲2,故排列爲X4XX;
c2=0 表示待排數字3的逆序數爲0,故排列爲X4X3;
c3=1 表示待排數字2的逆序數爲2,故排列爲24X3;
最終得排列2413
中位數數位 |
c1 |
c2 |
c3 |
進制 |
4 |
3 |
2 |
位權 |
3*2 |
2 |
1 |
遞減進位制數法:
中介數的低位指示了待排數字中較大數的逆序數。例如:
中介數:102
c3=2 表示待排數字4的逆序數爲2,故排列爲X4XX;
c2=0 表示待排數字3的逆序數爲0,故排列爲X4X3;
c1=1 表示待排數字2的逆序數爲2,故排列爲24X3;
最終得排列2413
中位數數位 |
c1 |
c2 |
c3 |
進制 |
2 |
3 |
4 |
位權 |
3*4 |
4 |
1 |