next_permutation(全排列算法)


 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; 


 先說這么多,等以后再補叭叭。。。。

 


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com