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

日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > 互聯網 > 全排列算法

全排列算法

來源:程序員人生   發布時間:2014-10-10 08:00:01 閱讀次數:2507次

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

        一、遞歸實現

        例如,如果集合是{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},可以用下面給出的簡單算法產生其所有排列,即集合(a,b,c,d)的所有排列有下面的排列組成:

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

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

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

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

[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<<"所有全排列的結果為:"<<endl;  
  5.     permutation(a,0,2);  
  6.     system("pause");  
  7.     return 0;  
  8. }  

    實現輸出部分數的全排列,總共有len個字符,輸出num個數的全排列

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實現

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

[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<< 生活不易,碼農辛苦
    如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
    程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 国产在线网 | 成人黄色毛片 | 欧美日韩久久精品 | 国产欧美日韩综合精品一区二区 | 免费av看 | 成人黄色免费网址 | 日韩三级网址 | 成人区精品一区二区婷婷 | 亚洲综合视频 | 波多野结衣的网站 | 久久久久97 | 国产一区二区在线视频播放 | 日本乱轮视频 | 久久久久高清 | 麻豆视频国产 | 天堂av中文在线 | 91麻豆精品国产91久久久使用方法 | 亚洲精选久久 | 日本综合视频 | 久久精品国产免费 | 偷拍自拍在线观看 | 免费观看av网站 | 国产精品亚洲成人 | 亚洲成人综合在线 | 波多野结衣精品在线 | uu天堂| 欧美不卡视频 | 日韩伦理一区二区 | 美国三级日本三级久久99 | 久久国产精品久久久 | 疯狂欧洲av久久成人av电影 | 久久久女女女女999久久 | 欧美精品一区二区三区四区五区 | 夜噜噜久久国产欧美日韩精品 | 在线看黄色av | 欧美日韩精品在线 | 日韩一区二区三区视频 | zzzwww在线看片免费 | 亚洲欧美在线视频 | 日韩影片在线观看 | 在线黄网 |