輸出全排列

2022-05-10 14:23:02 字數 1559 閱讀 7042

題目:給一串字元,求他的全排列

如:的全排列:   1 2 3

1 3 2

2 1 3

2 3 1

3 1 2

3 2 1

解法:

1.首先按志典順序進行排序(得到 1 2 3)

2.根據標記從後往前比較相鄰兩資料,若前者小於後者(2<3),標誌前者為x1(2),位置px(1),再次重後往前搜尋第乙個不小於x1(2)的資料,標記為x2(3)。交換x1(2),x2(3),然後把[px+1,last)標記範圍逆轉。得到乙個新的排列完成。

3.按方法2,迴圈往復,知道,找不到前者小於後則的時候,表明已經沒有新的排列。

正確性分析:(為什麼這樣就可以保證得到的為最小遞增)

當前排列和下一次排列:從第乙個元素開始當前數列與下一次數列不同的資料位置是px,並且下一次數列在px位置的資料為x2。由步驟2可以得出:在下一次得到的數列中[px+1,last)總是遞減的,[first,px)沒有改變,因為x2>x1,所以不管當前的[px+1,last]怎樣排列都比下一次數列大,反轉[px+1,last)使此子數列(遞增)為最小。從而保證的下一次數列為當前數列的字典序排列的next。

如: 當前數列為 1 2 4 3

由步驟2得:x1=2,x2=3, px=1(從0開始計數)

交換x1,x2得數列1 3 4 2, [px+1,last)=[4,2]是遞減的

[4,3] > [4,2]

翻轉 [4,2]得到[2,4],所以下一次數列為 1 3 2 4

演算法:在c++stl中已經實現了該演算法,名為:next_permutation()

1: #include
2: #include
3: #include
4: using

namespace std ;

5:
6: bool permutation(vector& a)
7:
18:     }
19:     if (i==0)
23:     pos = i ;
24:     for (i=a.size()-1;i>=0;--i)
29:     }
30:     if (-1==i)
33:     swap(a[pos-1],a[i]) ;
34:     reverse(a.begin()+pos,a.end());
35:     return

true ;

36:
37: }
38: void print(int i)
41: int main()
42: while(permutation(vint));
53: }

輸出全排列輸出

設r 為要進行全排列的n個元素,ri r 集合x中元素的全排列記為perm x ri perm x 表示全排列perm x 的每乙個排列前加上字首ri 則r的全排列歸納定義為如下 當n 1時,perm r r 當n 1時,perm r 由 r1 perm r1 r2 perm r2 rn perm ...

輸出全排列

5 2 輸出全排列 20分 請編寫程式輸出前nnn個正整數的全排列 n 10n 10n 10 並通過9個測試用例 即nnn從1到9 觀察nnn逐步增大時程式的執行時間。輸入格式 輸入給出正整數nnn 10 10 10 輸出格式 輸出1到nnn的全排列。每種排列佔一行,數字間無空格。排列的輸出順序為字...

輸出全排列

給定乙個值n,輸出1到n的全排列,遞迴進行,首先輸出第乙個元素 n種選法 之後遞迴輸出除第乙個元素之外的n 1個元素即可,每次要判斷當前待新增的元素是否在之前已經新增過了,如果沒有新增,則新增之後遞迴進行上述過程,具體實現見如下 include include include include inc...