我們知道c++裡自帶的有全排列,對於在演算法或者acm之類的競賽可謂是非常的好用的乙個函式。那麼在學習全排列和組合演算法之前我們先來看一下自帶的函式如何使用。
首先,對於全排列c++給出了兩個函式,next_permutation 和 prev_permutation 顧名思義,next_permutaion是指按字典序排列的下乙個公升序排列,而prev_permutation 則是指上乙個。
std::next_permutation函式原型
template
bool next_permutation (bidirectionaliterator first, bidirectionaliterator last );
template
bool next_permutation (bidirectionaliterator first,bidirectionaliterator last, compare comp);
注:我們只需給出需要排序的陣列或者向量的開始和結尾的位址便可得到下乙個排列。其中的要注意的是該函式是有返回值的,當當前排列存在以字典序順序更高的排列則返回
true,如果不存在則返回false(表示此時已經是字典序)。
對陣列next_permutation (a,a+5);
對向量:
next_permutation (v.begin() , v.end());
非字典序排列
這種方法比較簡單也比較好理解,但是缺點是輸出的時候不是字典序,這在很多的情況下並不適用。
思想:對於乙個陣列為,要想得到全排列那麼必須滿足的是每乙個元素都要放在第乙個位置,即 ,那麼第一次遞迴我們就確定第乙個位置的值。第二次可以的看成只有兩個元素的陣列,同樣以第一次遞迴的方法我們就確定了第二個位置的值,以此類推。
實現方法:
首先,我們需要乙個變數m來記錄這是在計算第幾位的值,那麼每次從m遍歷到的n即為全排列剩下的值。這個演算法是採用深度優先的方法,即每次確定乙個的值比如,第一次我們確定,第二次,第三次,第四次呢?
這裡就要用到交換,即先將2和3 交換,使得3在第二個位置,當第三個位置確定後,我們再將2和3調換回來,這樣就又恢復了原來的順序了。其實在一開始,確定每一位時都進行了交換只不過自身與自身交換沒有區別而已。
#include using namespace std;
void swap(int &a ,int &b)
void permutation(int arr,int m,const int n)
void permutation(int arr,int b,bool f,int m,const int n)
else
}}int main ()
; int b[3];
bool flag[3];
permutation (a,b,flag,0,3);
return 0;
}
全排列 字典序排列
include includeusing namespace std define dig num 4 void cal int str int first int last cout endl if first last bool get f l int list int former int l...
字典序全排列
思路 從左向右找到不符合遞增規律的第乙個數,比如1,2,5,4,3中的這個數就是2,將其與其右面遞增序列中的比他大的最小數,比如在前面例子中的3互換,得到1,3,5,4,2,最後,將該數右邊的遞增序列排序,得到1,3,2,4,5即可。上面這個是求某乙個數的下乙個排列,而全排列只需按這個思路,將初始陣...
字典序全排列
給出正整數n,則1 n這n個數可以構成n!種排列,把這些排列按照從小到大的順序 字典順序 列出,如n 3時,列出1 2 3,1 3 2,2 1 3,2 3 1,3 1 2,3 2 1 這6個排列。字典序演算法如下 假設這n個數的某乙個排列為 p p1 p2 p3.pj 1 pj pj 1.pk 1 ...