STL中 permutation函式的實現

2022-08-24 18:27:08 字數 856 閱讀 2192

stl庫中有乙個求全排列中當前排列的上乙個或下乙個排列的函式,permutation函式。

其中next_permutation()函式用於求下乙個排列;

prev_permutation()函式用於求上乙個排列。

求12345的下乙個排列,把最後兩位4和5交換,為12354;

如果是求13245的下乙個排列,也是把最後兩位交換,為13254;

前兩次交換是因為第4位上的數字小於第5位上的數字,把它們交換之後一定是大於原來的數字,而且一定是增加了最少的,也就是說這是他們的下乙個排列。

求14253的下乙個排列,第4位是大於第5位的,所以交換之後會變小,就不符合條件了,後兩位的交換已經不能變成更大的數,這時候應該改變的是第3位,和第3位交換可以選第4位和第5位,這裡應該選第5位,也就是從後往前第乙個大於要交換的數的數,為14352。

求15243的下乙個排列,按照前面的方法求過之後是15342,但是應該是15324,所以還應該把交換的數後面所以的數從小到大排序。

總結規律為:

從後往前找出第乙個逆序數a,再從後往前找出第乙個大於a的數b,交換兩個數之後,把原來a的位置之後的數從小到大排序。

#include #include #define n 10020

using namespace std;

int n, a[n];

void next_p()

}sort(a+i+1, a+n);

break;

}}int main()

void f()

sort(a+i+1, a+n, cmp);

break;

} }} int main()

STL中 permutation函式的實現

stl庫中有乙個求全排列中當前排列的上乙個或下乙個排列的函式,permutation函式。其中next permutation 函式用於求下乙個排列 prev permutation 函式用於求上乙個排列。求12345的下乙個排列,把最後兩位4和5交換,為12354 如果是求13245的下乙個排列,...

Java練習 排列 Permutation 問題

輸入個數n,自然數時,n屬於 1,9 輸出1 n所有不重複的排列 數字序列中不允許出現重複的數字 字元時,n 字母表長度,輸出a 第n個字元的全排列。按照排列組合,可知全排列個數為n!對string s abcde 的全排列,遞迴為 1 字首為a s為 bcde 直到s.length 為0.2 字首...

全排列演算法遞迴實現(Permutations)

全排列 permutations 對輸入的字元排列出所有可能的組合。例如,輸入 123 輸出 123 132 213 231 321 312輸入乙個字元,直接輸出就好 輸入兩個字元,輪流先輸出其中乙個字元再輸出另乙個 輸入三個字元,輪流輸出其中兩個字元再輸出另外乙個字元 由此可以發現,當n 1時,我...