1. 定義
是由Johnson-Trotter首先提出。如果已知n-1個元素的排列,將n插入到排列的不同位置,就得到了n個元素的排列。也可以直覺地認爲,只要把排列中任意相鄰的兩個元素交換位置,就可以得到一個新的排列。
2. 算法
以爲初始排列,剪頭所指一側,相鄰的數若比它小時,則稱該數處在活動狀態,的2,3,4都處於活動狀態。
生成下一個排列的步驟:
- S1: 若沒有數處於活動狀態則結束。
- S2: 將處於活動狀態的各數中值最大者設爲,則和它的剪頭所指一側相鄰的數互換位置,而且比大的所有數的剪頭改變方向,即改爲,改爲,轉S1。
2.1 求排列1234的下一個排列
2.2 求排列12345生成的第100個排列數是多少
通過2.1可以看出每個數字經過多少次排列向左或向右(初始移動是向左)移動一位,如下表
數字 | 2 | 3 | 4 | 5 |
---|---|---|---|---|
次數 | 60(3 ×4×5) | 20(4×5) | 5(1×5) | 1 |
所以這100次排列當中,
- 5排列了100次
- 4排列了20次
- 3排列了5次
- 2排列了2次。
因爲總共有5位數,所以5每經過10次排列後會回到起點,4每經過8次排列後會回到起點,3經過6次排列後會回到起點,2不會回到起點,2最多隻能排列2次。因此
(1)100/10=10,餘數爲0,說明此時5在第5位。(考慮全部數字)—— _ _ _ _ 5
(2)20/8=2,餘數爲4,說明此時4在第1位。(不考慮數字5)—— 4 _ _ _ 5
(3)5/6=0,餘數爲5,說明此時3在第2位。(不考慮數字4,5)—— 4 _ 3 _ 5
(4)2排列了2次,此時的對應的兩位數是21。(不考慮數字3,4,5)—— 4 2 3 1 5
因此排列12345生成的第100個排列數是42315。
2.3 求 23541是排列12345生成的第幾個排列
12345生成的排列總共有個。
通過2.2分析知道
(1)不考慮345,序列21表明了2排列了2次(移動了1次)
(2)不考慮45,序列231表明3排列了5次(移動了4次)
(3)不考慮5,序列2341表明4排列了18次(移動了17次)
此時,根據2.2的表就可以猜了,5排列了至少次剛好滿足上述要求,最後一個要求是要滿足5的位置,5處於第3位,86/10=6餘數是1,說明這是5還在第1位,增加1次排列即可讓5在第3位而又可以滿足(1)(2)(3)條件,此時可知88即爲最終所求。