現在有一道很簡單的題目,那就是輸出1——n的所有排列數!
比如說,輸入n=5;那麼要求求出1,2,3,4,5這幾個數所有的排列數!
c++中有乙個next_permutation函式,它包含在algorithm標頭檔案中,可以方便的求出所有的排列
數,可是你知道它是怎麼實現的麼?
現在,我對那個函式進行了簡單的模擬,模擬函式如下:
/**************************
輸出所有排列數的非遞迴演算法,經過演算測試,可行!
模擬next_permutation函式!
說簡單一點,用 1,2,3,4 可以得到:
原排列 中間轉換 值
1,2,3,4 3,2,1 ((3 * (3) + 2) * (2) + 1) * (1) = 23
1,2,4,3 3,2,0 ((3 * (3) + 2) * (2) + 0) * (1) = 22
1,3,2,4 3,1,1 ((3 * (3) + 1) * (2) + 1) * (1) = 21
1,3,4,2 3,1,0 ((3 * (3) + 1) * (2) + 0) * (1) = 20
1,4,3,2 3,0,1 ((3 * (3) + 0) * (2) + 1) * (1) = 19
. . .
. . .
. . .
4,3,2,1 0,0,0 ((0 * (3) + 0) * (2) + 0) * (1) = 0
上面的中間轉換指的是:每乙個數字後面比當前位數字大的數字的個數。比如:
1,3,4,2 中,1 後面有(3, 4, 2) 他們都大於1,所以第一位是 3
3 後面有(4, 2), 但只有4大於3,所以第二位是 1
4 後面有(2), 沒有比4 大的,所以第三位是 0
最後一位後面肯定沒有更大的,所以省略了乙個0。
經過這種轉換以後,就得到了一種表示方式(中間轉換),這種表達方式和原排列一一對應,可以相互轉化。
仔細觀察這種中間表達方式,發現它的第一位只能是(0,1,2,3),第二位只能是(0,1,2),第三位只能是(0,1)。
通常,數字是用十進位制表示的,計算機中用二進位制,但是現在,我用一種特殊的進製來表示數:
第一位用1進製,第二位用2進製。。。
於是就得到了這種中間表示方式的十進位制值。如:
階
| | |
1,1,0 ----> ((1 * (3) + 1) * (2) + 0) * (1) = 8
3,1,0 ----> ((3 * (3) + 1) * (2) + 0) * (1) = 20
這樣,就可以得到乙個十進位制數和乙個排列之間的一一對應的關係。
現在排列數和有序的十進位制數有了一一對應的關係(通過改變對應關係,可以使十進位制數公升序)。
到這裡已經可以很容易的得到任意乙個排列了;
按照上面的對應關係,一共可能的取值有(最高位可取四個值,次位取3個'''')4*3*2*1=24種;
上面的其實只是一種形式罷了,為了便於理解設立的模型!
**************************/
#includeusingnamespacestd;
constmax=50;
inta[max];
intpermutation(intn)//排列函式
}if(!flag)//較大數ii到最後進行逆序,即交換,這樣就產生了下乙個排列,原理類似於,找到下乙個較大的作為開始位的數,然後將後面的數字從最小開始即公升序
//當逆序數最大時,便不能再排列
}if(flag)return0;
elsereturn1;
}intmain(intargc,char*ar**)
{ intn,i;
while(1)
{cin>>n;
for(i=1;i<50;i++) a[i]=i;do{
for(i=1;i<=n;i++) cout<
求全排列 可重複 next permutation
字典序列演算法 字典序列演算法是一種非遞迴演算法。而它正是stl中next permutation的實現演算法。我們來看看他的思路吧 它的整體思想是讓排列成為可遞推的數列,也就是說從前一狀態的排列,可以推出一種新的狀態,直到最終狀態。比如說,最初狀態是12345,最終狀態是54321。其實我覺得這跟...
字典序(自己實現next permutation)
問題 輸入n,從小到大輸出從1到n,n個數的字典序 步驟 1.初始化,將1 n從小到大存入buf陣列 2.n個數的全排列有n!個,則呼叫n!次,並輸出字典序。3.my next permutation實現 從後往前遍歷buf陣列,每次比較buf i buf i 1 找到第乙個正序序列,記下此時的下標...
全排列生成演算法 next permutation
全排列的生成演算法有很多種,有遞迴遍例,也有迴圈移位法等等。c stl中定義的next permutation和prev permutation函式則是非常靈活且高效的一種方法,它被廣泛的應用於為指定序列生成不同的排列。本文將詳細的介紹prev permutation函式的內部演算法。按照stl文件...