1. 程式人生 > >next_permutation(全排列算法)

next_permutation(全排列算法)

ati end .... while ont 找到 PE -s for

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;
}


先說這麽多,等以後再補叭叭。。。。

next_permutation(全排列算法)