算法原理
SJT算法,即Steinhaus–Johnson–Trotter algorithm,是一種全排列生成算法。 在該算法中,不斷的尋找一種相鄰元素相互交換的順序,根據這種交換的順序,依次計算下一個排列。在SJT算法中,每次循環都進行一次滿足條件的相鄰元素的交換,直到不存在滿足條件的可交換的元素,此時說明所有排列的情況均已輸出,算法結束。
算法步驟
設[a1,a2 ... aN] 每一項都有向左或向右兩個移動方向。
1) 初始化所有移動方向向左;
2) 如果移動方向的值比自己小,就可移動,比如 <1 >2 <3, 每個數字前箭頭的方向表示該數字的移動方向,3可以移動,2和1不可移動;
3) 移動最大的可以動項,在上面例子中就是數字3;
4) 將所有比移動項大的項方向反轉,重複第三步,直到不能移動為止。
算法性能分析
記要全排列的元素總數為n,全排列一共n!種排列,在每次枚舉下一個排列時,我們都在上一個排列中尋找最大的可移動項,然後對其進行移動,因此總體複雜度是O(n*n!)。