使用字典序輸出全排列的思路是,首先輸出字典序最小的排列,然後輸出字典序次小的排列,……,最後輸出字典序最大的排列。這裡就涉及到乙個問題,對於乙個已知排列,如何求出其字典序中的下乙個排列。
這裡給出演算法步驟:
對於排列a[1...n],找到所有滿足a[j]a[i]的元素中,a[k]取得最小值。也就是說a[i]a[k+1]。
交換a[i]與a[k].
對於a[i+1...n],反轉該區間內元素的順序。也就是說a[i+1]與a[n]交換,a[i+2]與a[n-1]交換,……,這樣就得到了a[1...n]在字典序中的下乙個排列。
如何得到21453
1.從尾部找第乙個a[i]
附上我的**:
#include #include #include #include using namespace std;
const int maxn=15;
int a[2][maxn];
int flag=0;
int n,cnt;
void init()
}tmp=a[flag][i];
a[flag][i]=a[flag][k];
a[flag][k]=tmp;
for(int j=0; j<=i; j++)
for(int j=i+1; j
全排列生成演算法
recursive generating 這個演算法接受乙個元素均不同的陣列,通過遞迴的呼叫以生成所有全排列序列。遞迴的原則在於,生成序列的全排列p a1,a2,an 等價於生成序列 這構成了遞迴演算法設計的deduction case 而base case,則是要生成全排列的序列只有乙個元素。整個...
全排列生成演算法
問題 生成1 n的全排列 生成乙個陣列中所有元素的全排列 思想 依據字典序順序,由前乙個排列,生成後乙個排列。字典序方法 輸入前乙個排列,輸出後乙個排列 vector nextpermutation vector p 主呼叫方法 void generatepermutation int n for ...
全排列生成演算法
我們假如有一串式子,排列組合的結果會有很多種,全排列就是按照字典序有序的將所有的排列組合的性質的陳列出來 問題可以這麼描述 對於給定的集合a,其中的n個元素互不相同,如何輸出這n個元素的所有排列 全排列 我們來這麼看這個問題,加入有n個資料要進行全排列,我們可以假想我們面前有n個盒子 每一次我們有大...