全排列問題

2022-09-12 16:51:23 字數 1035 閱讀 4789

void swap(char &a,char &b)

void permutation(char *a,int beg,int end)

{ if(beg == end)

{ cout<0;--i)

{ if (a[i-1]i-1;--j)

{if (a[j] >a[i-1])

{swap(a[j],a[i -1 ]);

reversal(a,i,n-1);

cout《一、遞迴實現

從集合中依次選出每乙個元素,作為排列的第乙個元素,然後對剩餘的元素進行全排列,如此遞迴處理,從而得到所有元素的全排列。以對字串abc進行全排列為例,我們可以這麼做:以abc為例

固定a,求後面bc的排列:abc,acb,求好後,a和b交換,得到bac

固定b,求後面ac的排列:bac,bca,求好後,c放到第一位置,得到cba

固定c,求後面ba的排列:cba,cab。**可如下編寫所示:

二、字典序排列

把公升序的排列(當然,也可以實現為降序)作為當前排列開始,然後依次計算當前排列的下乙個字典序排列。

對當前排列從後向前掃瞄,找到一對為公升序的相鄰元素,記為i和j(i < j)。如果不存在這樣一對為公升序的相鄰元素,則所有排列均已找到,演算法結束;否則,重新對當前排列從後向前掃瞄,找到第乙個大於i的元素k,交換i和k,然後對從j開始到結束的子串行反轉,則此時得到的新排列就為下乙個字典序排列。

生成給定全排列的下乙個排列 所謂乙個的下乙個就是這乙個與下乙個之間沒有字典順序中相鄰的字串。這就要求這乙個與下乙個有盡可能長的共同字首,也即變化限制在盡可能短的字尾上。

839647521的下乙個排列.

從最右開始,找到第乙個比右邊小的數字4(因為4<7,而7>5>2>1),再從最右開始,找到4右邊比4大的數字5(因為4>2>1而4<5),交換4、5,此時5右邊為7421,倒置為1247,即得下乙個排列:839651247.用此方法寫出全排列的非遞迴演算法如下

演算法的目的是要得到詞典順序,因為4是第乙個比右邊小的數字,所以4之後的串7521肯定是從從大到小的,所以將4和5交換後要對這個字串翻轉

全排列問題

一 全排列問題演算法描述如下 舉例 345的全排列分別為 345 354 435 453 534 543,可見將整組數中的所有的數分別與第乙個數交換,這樣就總是在處理後n 1個數的全排列。又舉例 45的全排列有 45 54 可見將第乙個數分別與後面的數交換後輸出即為45的全排列。所以,對於乙個很長一...

全排列問題

題目描述814 全排列問題 鍵盤輸入n 1 n 10 個字元,輸出輸出其全排序。第一行為字元個數k,第二行為k個字元,不用空格隔開。輸出其每種排列佔一行,各字元間用一空格隔開。樣例輸入 3abc 樣例輸出 a b c a c b b a c b c a c b a c a b includeint ...

全排列問題

全排列就是從第乙個數字起 每個數分別與它後面的數字交換 用c 寫乙個函式,如 foo const char str 列印出 str 的全排列,如 abc 的全排列 abc,acb,bca,dac,cab,cba。第一種方法 用遞迴 不包含有重複數字或字元出現的情況 void swap char a,...