關於next permutation函式的模擬!

2021-09-30 15:38:06 字數 2336 閱讀 1174

現在有一道很簡單的題目,那就是輸出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文件...