?STL提供了兩個用來計算排列組合關系的算法,分別是next_permutation和prev_permutation。
首先解釋下全排列,顧名思義,即一組數的全部排列的情況。
next_permutation 即列出一組數的全部排列情況,不過列出的排列先后順序有一定的規則,下面就講講next_permutation列出的先后規則。。。
規則
1.首先從最尾端開始往前尋找兩個相鄰元素,令第一元素為*i,第二元素為*ii,且滿足*i<*ii。
2.找到這樣一組相鄰元素后,再從最尾端開始往前檢驗,找出第一個大于*i的元素,令為*j,將i,j元素對調(swap)。
3.再將ii之后的所有元素顛倒(reverse)排序。
?
? ?舉個實例,假設有序列{0,1,2,3,4},下圖便是套用上述演算法則,一步一步獲得“下一個”排列組合。圖中只框出那符合“一元素為*i,第二元素為*ii,且滿足*i<*ii?”的相鄰兩元素,至于尋找適當的j、對調、逆轉等操作并未顯示出。
?
0 1 2 3 4-》0 1 2 4 3-》0 1 3 2 4-》0 1 3 4 2-》0 1 4 2 3-》0 1 4 3 2..........
剛接觸不是說的很清楚,來個簡單的應用
輸出(0 1 2 3 4)的全排列
#include<iostream>?
#include<algorithm>?
using namespace std;?
int main()?
{?
??? int ans[5]={0,1,2,3,4};?
??? sort(ans,ans+5);??? /* 這個sort可以不用,因為{0 ,1,2,3,4}已經排好序*/?
??? do???????????????????????????? /*注意這步,如果是while循環,則需要提前輸出*/?
??? {?
??????? for(int i=0;i<5;++i)?
??????????? cout<<ans[i]<<" ";?
??????? cout<<endl;?
??? }while(next_permutation(ans,ans+5));??
??? return 0;?
}?
?先說這么多,等以后再補叭叭。。。。
?