=1),要求輸出這個集合中元素的所有可能的排列。 一、遞歸實現(xiàn) 例如,如果集合是{a,b,c},那么這個集合中元素的所有排列是{(a,b,c),(a,c,b)">

多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內(nèi)最全IT社區(qū)平臺 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁 > 互聯(lián)網(wǎng) > 全排列算法

全排列算法

來源:程序員人生   發(fā)布時間:2014-10-10 08:00:01 閱讀次數(shù):2504次

 全排列在很多程序都有應(yīng)用,是一個很常見的算法,常規(guī)的算法是一種遞歸的算法,這種算法的得到基于以下的分析思路。  給定一個具有n個元素的集合(n>=1),要求輸出這個集合中元素的所有可能的排列。

        一、遞歸實現(xiàn)

        例如,如果集合是{a,b,c},那么這個集合中元素的所有排列是{(a,b,c),(a,c,b),(b,a,c),(b,c,a),(c,a,b),(c,b,a)},顯然,給定n個元素共有n!種不同的排列,如果給定集合是{a,b,c,d},可以用下面給出的簡單算法產(chǎn)生其所有排列,即集合(a,b,c,d)的所有排列有下面的排列組成:

     (1)以a開頭后面跟著(b,c,d)的排列

    (2)以b開頭后面跟著(a,c,d)的排列

    (3)以c開頭后面跟著(a,b,d)的排列

    (4)以d開頭后面跟著(a,b,c)的排列,這顯然是一種遞歸的思路,于是我們得到了以下的實現(xiàn):

[cpp] view plaincopy
  1. #include "iostream"  
  2. using namespace std;  
  3.   
  4. void permutation(char* a,int k,int m)  
  5. {  
  6.     int i,j;  
  7.     if(k == m)  
  8.     {  
  9.         for(i=0;i<=m;i++)  
  10.             cout<<a[i];  
  11.         cout<<endl;  
  12.     }  
  13.     else  
  14.     {  
  15.         for(j=k;j<=m;j++)  
  16.         {  
  17.             swap(a[j],a[k]);  
  18.             permutation(a,k+1,m);  
  19.             swap(a[j],a[k]);  
  20.         }  
  21.     }  
  22. }  
  1. int main(void)  
  2. {  
  3.     char a[] = "abc";  
  4.     cout<<a<<"所有全排列的結(jié)果為:"<<endl;  
  5.     permutation(a,0,2);  
  6.     system("pause");  
  7.     return 0;  
  8. }  

    實現(xiàn)輸出部分?jǐn)?shù)的全排列,總共有l(wèi)en個字符,輸出num個數(shù)的全排列

void permutation(char* a,int k,int len,int num)  
{  
    int i,j;  
    if(k == num)  
    {  
        for(i=0;i<num;i++)  
            cout<<a[i];  
        cout<<endl;  
    }  
    else  
    {  
        for(j=k;j<len;j++)  
        {  
            swap(a[j],a[k]);  
            permutation(a,k+1,len,num);  
            swap(a[j],a[k]);  
        }  
    }  
}

二、STL實現(xiàn)

        有時候遞歸的效率使得我們不得不考慮除此之外的其他實現(xiàn),很多把遞歸算法轉(zhuǎn)換到非遞歸形式的算法是比較難的,這個時候我們不要忘記了標(biāo)準(zhǔn)模板庫已經(jīng)實現(xiàn)的那些算法,這讓我們非常輕松。STL有一個函數(shù)next_permutation(),它的作用是如果對于一個序列,存在按照字典排序后這個排列的下一個排列,那么就返回true且產(chǎn)生這個排列,否則返回false。注意,為了產(chǎn)生全排列,這個序列要是有序的,也就是說要調(diào)用一次sort。實現(xiàn)很簡單,我們看一下代碼:

[cpp] view plaincopy
  1. #include "iostream"  
  2. #include "algorithm"  
  3. using namespace std;  
  4.   
  5. void permutation(char* str,int length)  
  6. {  
  7.     sort(str,str+length);  
  8.     do  
  9.     {  
  10.         for(int i=0;i<length;i++)  
  11.             cout<<str[i];  
  12.         cout<<endl;  
  13.     }while(next_permutation(str,str+length));  
  14.   
  15. }  
  16. int main(void)  
  17. {  
  18.     char str[] = "acb";  
  19.     cout<<str<< 生活不易,碼農(nóng)辛苦
    如果您覺得本網(wǎng)站對您的學(xué)習(xí)有所幫助,可以手機掃描二維碼進行捐贈
    程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 亚洲乱码在线 | 激情小说 校园春色 | 最新中文字幕第一页 | 欧美精品一区二区三区免费播放 | 狂野欧美性猛交xxxx免费按摩 | 热灸灸这里只有精品 | 老司机亚洲精品影院在线 | 日本成a人免费视频 | 亚洲一区二区三区四区在线观看 | 性欧美超高清hd | 羞羞影院体验区 | 3344成年站福利在线视频免费 | 韩国一级做a爰片性色毛片 韩国在线观看免费观看影院 | 欧美一区二区三区不卡 | 中文国产成人精品久久一 | 午夜理伦三级在线观看 | 性xxxx免费观看视频 | 性xxxx视频播放免费 | 国产成人精品福利网站在线 | 亚洲最大在线视频 | 欧美色涩| 国产一区二区三区夜色 | 欧美在线精品永久免费播放 | 日韩精品无码一区二区三区 | 999毛片免费 | 亚洲韩精品欧美一区二区三区 | 日韩精品一区二区三区在线观看l | 大香交伊人 | 禁视频网站在线观看漫画 | 成人精品国产 | 最近免费中文字幕视频高清在线看 | 久久欧美精品欧美久久欧美 | 国产精品第4页 | 在线观看国产免费高清不卡 | 欧美1卡一卡二卡三新区 | 波多野结衣午夜 | a4yy私人毛片在线 | 午夜在线视频免费 | 俺也去第四色 | 26uuu色噜噜欧美在线播放 | 精品一区二区久久久久久久网站 |