全排列的實現

2021-07-30 04:26:40 字數 2692 閱讀 2652

在c++的模板中,有一對專門用於實現數字或字元全排列的模板:next_permutation(_biter, _biter)和prev_permutation(_biter, _biter)。前者實現向後排列,後者實現向前排列,即前者在原順序上依次產生較大的排列,後者則相反。

舉個例子:假設需要產生以「354」為基礎的全排列,使用next_permutation(_biter, _biter),則下乙個排列為「435」,而使用prev_permutation(_biter, _biter),則下乙個排列為「345」。

#include 

using

namespace

std;

int main()

輸出結果為:

1243

1324

1342

1423

1432

2134

2143

2314

2341

2413

2431

3124

3142

3214

3241

3412

3421

4123

4132

4213

4231

4312

4321

從上面的結果中我們可以發現沒有原始排列「1234」,這時因為該模板實現的是以原始排列為基礎依次產生後序排列,所以並不會產生原始的排列,這裡需要注意下!

如果我們把上述**中的next_permutation(ss.begin(), ss.end())換成prev_permutation(ss.begin(), ss.end())會產生什麼結果呢?

結果如下:

什麼都沒有,這又是為什麼呢?這是因為prev_permutation(_biter, _biter)產生的是以「1234」為基礎的更小的排列,但是「1234」已經是最小的排列了,那麼自然就不會產生任何結果了。既然是這樣那我們把原ss改為「4321」是不是就可以了呢,我們看一下執行結果:

4312

4231

4213

4132

4123

3421

3412

3241

3214

3142

3124

2431

2413

2341

2314

2143

2134

1432

1423

1342

1324

1243

1234

果然實現了全排列。(還是要注意,結果中同樣沒有原排列「4321」

從上面的例子中不難看出,如果給你乙個無序的字串或者陣列,那麼你首先需要對它進行排序,然後才能使用模板來求全排列。

比如:

#include 

using

namespace

std;

int main()

; sort(num, num + 5);//先排序

while(next_permutation(num, num + 5))

return

0;}

設r=是要進行排列的n個元素,ri=r-。

1.當n=1時,perm(r)=(r),其中r是集合r中唯一的元素。

2.當n>1時,perm(r)可由(r1)+perm(r1),(r2)+perm(r2),…,(rn)+perm(rn)構成。

舉例「123」:

1+perm(2,3)→1+(2+prem(3)) = 123

1+perm(2,3)→1+(3+perm(2)) = 132

2+perm(1,3)→2+(1+perm(3)) = 213

2+perm(1,3)→2+(3+perm(1)) = 231

3+perm(2,1)→3+(2+perm(1)) = 321

3+perm(2,1)→3+(1+perm(2)) = 312

實現**如下:

#include 

using

namespace

std;

void permutation(int arry, int low, int high)

else

}}int main()

; permutation(num, 0, 3);

return

0;}

執行結果:

1234

1243

1324

1342

1432

1423

2134

2143

2314

2341

2431

2413

3214

3241

3124

3142

3412

3421

4231

4213

4321

4312

4132

4123

全排列的實現

程式設計思路如下 擷取自 erlang程式設計 3.8 除錯的 include include include using namespace std void insert string str,char ch,vector aa void fun string array,vector a st...

全排列實現

參考的是 演算法競賽入門 p185 方法是用乙個額外的陣列a,不斷放入物件到這個陣列中,直到n個為止。include using namespace std int total 0 void permutation char s,char a,int n,int cur total cout end...

STL中的全排列函式實現全排列

標頭檔案 inlcude這裡先說兩個概念 下乙個排列組合 和 上乙個排列組合 對序列 每乙個元素都比後面的小,按照字典序列,固定a之後,a比bc都小,c比b大,它的下乙個序列即為,而的上乙個序列即為,同理可以推出所有的六個序列為 其中沒有上乙個元素,沒有下乙個元素。a.函式模板 next permu...