全排列的生成

2021-06-05 14:11:09 字數 1226 閱讀 9461

前兩種是字典序,第三種非字典序。

方法一:組合數學方法 (總結規律,得出結論,偏向數學)

顧名思義,這種方法的思想就是將所有的n元排列按「字典順序」排成隊,以12…n為第乙個排列,排序的規則,也就是有乙個排列(p)=(p1p2p3…pn)直接生成下乙個排列的演算法可歸結為:

(1)求滿足關係式p(k-1)using namespace std;

bool next_permutation(char* str)

} if(0 == i)

//步驟二

int j = 0;

for(k = 0; k < strlen(str); k++)

} //步驟三

str[i - 1] ^= str[j];

str[j] ^= str[i - 1];

str[i - 1] ^= str[j];

//步驟四

k = strlen(str) - 1;

while(i < k)

return 1;

}int main()

cout << i << endl;

return 0;

}補充:在c++的stl中也有next_permutation函式。其實現演算法就是本演算法。

方法二:通過dfs程式設計實現(偏向程式設計)。

public class test 

int i = 1;

for(i = 1; i <= n; i++)

} }public static void main(string argus)

}

此程式可以從n個數選m個的所有排列。結果就是字典序。

方法三:遞迴,每加入乙個元素,就將此元素插到之前元素的中間。比如當前字串"abc",新增'd'後,可以是「abcd」,「abdc」,「adbc」,「dabc」.以此類推。但是此種方法並非是字典序。

#include #include char srcstr = "abcde";

void dfs(char* str, int curlen)

char ch = srcstr[curlen];

curstr[curlen] = ch;

int i = curlen - 1;

for (i; i >= 0; i--)

dfs(curstr, curlen + 1);

}int main()

全排列的生成

將會以生成乙個 abcde 的乙個全排列為例 全排列的生成,就是從後面數,找到第一符合順序的 如 d e 這樣的訊號。就要開始處理。處理方法是 將找到這個符合順序的位置 如 b c 那麼就把 c 後面 包括 c 在內的字串生成乙個排好順序 恢復熵值 再從左邊走,找到第乙個比 b 大的字元,那麼就把這...

全排列生成的迭代演算法

given a collection of distinct numbers,return all possible permutations.目前web上大多數解法都是遞迴解法,基於 所有的遞迴演算法都存在對應的迭代演算法 的基本原理,本文提出了一種迭代演算法,通過online judge。cla...

全排列生成演算法

recursive generating 這個演算法接受乙個元素均不同的陣列,通過遞迴的呼叫以生成所有全排列序列。遞迴的原則在於,生成序列的全排列p a1,a2,an 等價於生成序列 這構成了遞迴演算法設計的deduction case 而base case,則是要生成全排列的序列只有乙個元素。整個...