全排列的產生

來源:互聯網
上載者:User

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

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

顧名思義,這種方法的思想就是將所有的n元排列按“字典順序”排成隊,以12…n為第一個排列,排序的規則,也就是有一個排列(p)=(p1p2p3…pn)直接產生下一個排列的演算法可歸結為:
(1)求滿足關係式p(k-1)<p(k)的k的最大值,設為i,即i=max{k|p(k-1)<p(k)}
(2)求滿足關係式p(i-1)<p(k)的k的最大值,設為j,即j=max{k|p(i-1)<p(k)}
(3)p(i-1)與p(j)互換位置得q=(q1q2...qn)
(4)q=(q1q2...q(i-1)q(i)...qn)中qi...qn部分的順序逆轉,得q1q2...q(i-1)qn...q(i+1)q(i)即為所求的下一個排列。

#include<iostream>using namespace std;bool next_permutation(char* str){//步驟一int i = 0;int k = 1;for(k = 1; k < strlen(str); k++){if(str[k - 1] < str[k]){i = k;}}if(0 == i){return 0;}//步驟二int j = 0;for(k = 0; k < strlen(str); k++){if(str[i - 1] < str[k]){j = k;}}//步驟三str[i - 1] ^= str[j];str[j] ^= str[i - 1];str[i - 1] ^= str[j];//步驟四k = strlen(str) - 1;while(i < k){str[i] ^= str[k];str[k] ^= str[i];str[i] ^= str[k];i++;k--;}return 1;}int main(){char str[10] = "abcde";int i = 1;while(next_permutation(str)){cout << str << endl;i++;}cout << i << endl;return 0;}

 補充:在C++的STL中也有next_permutation函數。其實現演算法就是本演算法。

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

public class Test {public static int N;public static int M;public static int ans = 0;public static int[] flag = new int[1000];public static void DFS(String str, int depth){if(depth == M){System.out.println(str);ans++;return;}int i = 1;for(i = 1; i <= N; i++){if(0 == flag[i]){str = str + i;flag[i] = 1;depth++;DFS(str, depth);depth--;flag[i] = 0;str = str.substring(0, str.length() - 1);}}}public static void main(String argus[]) {N = 5;M = 4;DFS("", 0);System.out.println(ans);}}

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

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

#include <stdio.h>#include <string.h>char srcStr[] = "abcde";void dfs(char* str, int curLen) {    char curStr[10];    strcpy(curStr, str);    if (curLen == 5) {        curStr[5] = '\0';        printf("%s\n", curStr);        return;    }    char ch = srcStr[curLen];    curStr[curLen] = ch;    int i = curLen - 1;    for (i; i >= 0; i--) {        dfs(curStr, curLen + 1);        char tmp = curStr[i + 1];        curStr[i + 1] = curStr[i];        curStr[i] = tmp;    }    dfs(curStr, curLen + 1);}int main() {    char curStr[10] = "a";    dfs(curStr, 1);    return 0;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.