亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

全排列算法的非遞歸實現與遞歸實現的方法(C++)

2020-01-26 16:09:01
字體:
來源:轉載
供稿:網友
(一)非遞歸全排列算法
基本思想是:
    1.找到所有排列中最小的一個排列P.
    2.找到剛剛好比P大比其它都小的排列Q,
    3.循環執行第二步,直到找到一個最大的排列,算法結束.
下面用數學的方法描述:
給定已知序列 P =  A1A2A3An ( Ai!=Aj , (1<=i<=n  , 1<=j<=n, i != j  ) )
找到P的一個最小排列Pmin = P1P2P3Pn  有  Pi > P(i-1) (1 < i <= n)
從Pmin開始,總是目前得到的最大的排列為輸入,得到下一個排列.
方法為:
1.從低位到高位(從后向前),找出“不符合趨勢”的數字。即找到一個Pi,使Pi < P(i+1)。
  若找不到這樣的pi,說明我們已經找到最后一個全排列,可以返回了。
2.在 P(i+1)P(i+2)Pn 中,找到一個Pj,便得 Pj"剛剛好大于"Pi.
  ("剛剛好大于"的意思是:在 P(i+1)P(i+2)Pn 中所有大于Pi的元素構成的集合中最小的元素.)
3.交換 Pi , Pj 的位置.注意:此處不改變i和j的值,改變的是Pi和Pj.
4.交換后, P1P2P3Pn  并不是準確的后一個排列。因為根據第1步的查找,我們有P(i+1) > P(i+2) > . > Pn
  即使進行了Pi和Pj的交換,這仍然是這一部分最大的一個排列。將此排列逆序倒置(變成最小的排列)即為所求的下一個排列.
5.重復步驟1-4,直到步驟1中找不到“不符合趨勢”的數字.
復制代碼 代碼如下:

//交換數組a中下標為i和j的兩個元素的值
void swap(int* a,int i,int j)
{
    a[i]^=a[j];
    a[j]^=a[i];
    a[i]^=a[j];
}

//將數組a中的下標i到下標j之間的所有元素逆序倒置
void reverse(int a[],int i,int j)
{
    for(;i<j;++i,--j)
    {
         swap(a,i,j);
    }
}

void print(int a[],int length)
{
    for(int i=0;i<length;++i)
         cout<<a[i]<<" ";
    cout<<endl;
}

//求取全排列,打印結果
void combination(int a[],int length)
{
    if(length<2) return;

    bool end=false;
    while(true)
    {
         print(a,length);

         int i,j;
         //找到不符合趨勢的元素的下標i
         for(i=length-2;i>=0;--i)
         {
             if(a[i]<a[i+1]) break;
             else if(i==0) return;
         }

         for(j=length-1;j>i;--j)
         {
             if(a[j]>a[i]) break;
         }

         swap(a,i,j);
         reverse(a,i+1,length-1);
    }
}

(二)遞歸算法
令E= {e1 , ..., en }表示n 個元素的集合,我們的目標是生成該集合的所有排列方式。令Ei 為E中移去元素i 以后所獲得的集合,perm (X) 表示集合X 中元素的排列方式,ei . p e r m(X)表示在perm (X) 中的每個排列方式的前面均加上ei 以后所得到的排列方式。例如,如果E= {a, b, c},那么E1= {b, c},perm (E1 ) = ( b c, c b),e1 .perm (E1) = (a b c, a c b)。對于遞歸的基本部分,采用n = 1。當只有一個元素時,只可能產生一種排列方式,所以perm (E) = ( e),其中e 是E 中的唯一元素。當n > 1時,perm (E) = e1 .perm (E1 ) +e2 .p e r m(E2 ) +e3.perm (E3) + ⋯ +en .perm (En )。這種遞歸定義形式是采用n 個perm (X) 來定義perm (E), 其中每個X 包含n- 1個元素。至此,一個完整的遞歸定義所需要的基本部分和遞歸部分都已完成。
當n= 3并且E=(a, b, c)時,按照前面的遞歸定義可得perm (E) =a.perm ( {b, c} ) +b.perm ( {a,c} ) +c.perm ( {a, b} )。同樣,按照遞歸定義有perm ( {b, c} ) =b.perm ( {c} ) +c.perm ( ), 所以a.perm ( {b, c} ) = ab.perm ( {c} ) + ac.perm ( ) = a b . c + ac.b = (a b c, a c b)。同理可得b.perm ( {a, c}) = ba.perm ( {c}) + bc.perm ( {a}) = b a . c + b c . a = (b a c, b c a),c.perm ( {a, b}) =ca.perm ( ) + cb.perm ( {a}) = c a . b + c b . a = (c a b, c b a)。所以perm (E) = (a b c, a c b, b a c, b c a,c a b, c b a)。注意a.perm ( {b, c} )實際上包含兩個排列方式:abc 和a c b,a 是它們的前綴,perm ( {b, c} )是它們的后綴。同樣地,ac.perm ( ) 表示前綴為a c、后綴為perm ( ) 的排列方式。程序1 - 1 0把上述perm (E) 的遞歸定義轉變成一個C++ 函數,這段代碼輸出所有前綴為l i s t [ 0:k-1], 后綴為l i s t [ k:m] 的排列方式。調用Perm(list, 0, n-1) 將得到list[0: n-1] 的所有n! 個排列方式,在該調用中,k=0, m= n - 1,因此排列方式的前綴為空,后綴為list[0: n-1] 產生的所有排列方式。當k =m 時,僅有一個后綴l i s t [ m ],因此list[0: m] 即是所要產生的輸出。當k<m時,先用list[k] 與l i s t [ k:m] 中的每個元素進行交換,然后產生list[k+1: m] 的所有排列方式,并用它作為list[0: k] 的后綴。S w a p是一個inline 函數,它被用來交換兩個變量的值
復制代碼 代碼如下:

template <class T>
inline void Swap(T& a, T& b)
{
    // 交換a和b
    T temp = a; a = b; b = temp;
}

template<class T>
void Perm(T list[], int k, int m)
{
    //生成list [k:m ]的所有排列方式
    int i;
    if (k == m)
    {
         //輸出一個排列方式
         for (i = 0; i <= m; i++)
             cout << list [i];
         cout << endl;
    }
    else // list[k:m ]有多個排列方式
    {
         // 遞歸地產生這些排列方式
         for (i=k; i <= m; i++)
         {
             Swap (list[k], list[i]);
             Perm (list, k+1, m);
             Swap (list [k], list [i]);
         }
    }
}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久久久久久久久久久久久久久久av| 国产成人精品在线视频| 日韩精品欧美国产精品忘忧草| 久久亚洲精品毛片| 欧美日韩不卡合集视频| 久久久久久久电影一区| 国产精品免费在线免费| 97欧美精品一区二区三区| 亚洲欧洲日产国产网站| 国产精品人成电影| 日韩高清av一区二区三区| 欧美激情欧美狂野欧美精品| 欧美精品激情blacked18| 亚洲国产日韩欧美在线99| 久久久久亚洲精品成人网小说| 大胆人体色综合| 欧美激情在线视频二区| 成人免费视频97| 亚洲美女福利视频网站| 视频直播国产精品| 日日噜噜噜夜夜爽亚洲精品| 庆余年2免费日韩剧观看大牛| 亚洲美女黄色片| 456亚洲影院| 国产日韩精品在线| 成人做爽爽免费视频| 国产第一区电影| 成人精品视频在线| 91黑丝高跟在线| 一本一道久久a久久精品逆3p| 成人久久一区二区三区| 按摩亚洲人久久| 日韩电影在线观看中文字幕| 伊人亚洲福利一区二区三区| 中文字幕久热精品在线视频| 成人97在线观看视频| 亚洲电影天堂av| 97久久久免费福利网址| 91精品国产成人www| 国产精品自产拍在线观看中文| 91免费欧美精品| 亚洲美女自拍视频| 日韩免费av一区二区| 国产国产精品人在线视| 久久中文字幕视频| 97色在线视频观看| 黑人巨大精品欧美一区二区免费| 中文字幕在线观看日韩| 北条麻妃99精品青青久久| 欧美日韩另类视频| 亚洲高清av在线| 国产精品电影网站| 国产成人福利视频| 欧美性猛交xxxxx水多| 日韩免费在线视频| 成人中文字幕+乱码+中文字幕| 亚洲黄色有码视频| 一夜七次郎国产精品亚洲| 精品人伦一区二区三区蜜桃免费| 日韩综合中文字幕| 国产一区在线播放| 国产亚洲欧美一区| 亚洲小视频在线观看| 热久久99这里有精品| 最新国产成人av网站网址麻豆| 欧美精品久久久久久久久久| 成人精品久久一区二区三区| 久久久国产精品x99av| 2021久久精品国产99国产精品| 国产精品一区二区三区久久久| 成人在线精品视频| 尤物yw午夜国产精品视频| 精品久久香蕉国产线看观看亚洲| 国产精品三级美女白浆呻吟| 日本免费久久高清视频| 日韩精品在线免费| 国产精品美女999| 国产在线日韩在线| 91po在线观看91精品国产性色| 91精品国产成人www| 亚洲高清在线观看| 欧美日韩成人在线观看| 久久国产精品久久国产精品| 国自在线精品视频| 欧美夫妻性视频| 亚洲欧美日韩精品久久奇米色影视| 在线看国产精品| 日韩a**中文字幕| 亚洲一级黄色片| 亚洲mm色国产网站| 在线日韩精品视频| 在线观看国产精品91| 欧美裸体xxxx极品少妇| 美日韩精品免费视频| 久久久精品一区二区| 国产精品最新在线观看| 国产精品扒开腿做爽爽爽男男| 国产福利成人在线| 久热精品视频在线观看| 奇米一区二区三区四区久久| 国产成人福利视频| 97在线观看免费高清| 国产精品国产亚洲伊人久久| 亚洲欧美一区二区精品久久久| 国产精品视频999| 免费av一区二区| 亚洲成人av资源网| 91在线视频导航| 黑人狂躁日本妞一区二区三区| 日韩中文字幕欧美| 亚洲免费成人av电影| 国产精品盗摄久久久| 国产成人精彩在线视频九色| 欧美成在线视频| 精品色蜜蜜精品视频在线观看| 欧美日韩综合视频网址| 亚洲免费伊人电影在线观看av| 久久精品福利视频| 久久成人亚洲精品| 亚洲2020天天堂在线观看| 精品视频在线观看日韩| 国产亚洲精品久久| 久久伊人91精品综合网站| 欧美亚洲在线播放| 国产视频精品xxxx| 国产亚洲精品91在线| 亚洲区在线播放| 成人免费看黄网站| 91视频国产一区| 精品精品国产国产自在线| 欧美性猛交xxxx乱大交极品| 日韩影视在线观看| 精品久久久久久亚洲精品| 欧美在线视频观看免费网站| 久久精品国产久精国产一老狼| 欧美成人黑人xx视频免费观看| 久久亚洲电影天堂| 91久久精品国产| 精品自拍视频在线观看| 亚洲国产精品高清久久久| 国产日韩欧美在线| 久久久久久九九九| 亚洲一区二区久久久| 97免费视频在线播放| 久久九九精品99国产精品| 欧美日韩国产第一页| 久久综合久久美利坚合众国| 欧美极品美女电影一区| 久久久噜噜噜久噜久久| 亚洲精品v天堂中文字幕| 成人精品视频在线| 国产精品日韩在线播放| 国产女人精品视频| 美日韩在线视频| 中文在线资源观看视频网站免费不卡| 亚洲国产精久久久久久久| 亚洲www在线观看| 欧美激情一二三| 亚洲成人激情在线观看| 欧美日韩黄色大片| 国内精品中文字幕| 亚洲品质视频自拍网| 日韩精品极品视频免费观看| 欧美成年人视频网站欧美|