非遞迴的全排列輸出

2021-09-06 20:40:17 字數 1735 閱讀 9283

對於任意給定的1~9, 給出所有的不出現重複數字的排列

由於討厭使用遞迴(**好寫,但是執行效率不高),也不想使用stl模板之類,於是用標準c++單獨寫了乙個**

如下://

// 本**用於生成n的全排列,結果儲存在permutation二維陣列當中

// 生成的原理:

//     假定乙個完成了n-1個數的不重複的排列,並放到permuatation陣列當中的前(n-1)!行

//     那麼第n個數字進來,只是在原有的排列當中的n個位置插入

//     所以,只要把原有的(n-1)!個組合複製n次,每次在不同的位置插入n這個數字即可

// 為了方便使用

//     這個實現放到函式當中,返回到陣列作為引數傳遞進來使用

#include

#include

usingnamespacestd;

unsignedchar* permutation(intlen)

longintsize=1;

for(inti=2; i<=len; i++) size*=i;

unsignedchar*permutation=newunsignedchar[size*len];

longintncount = 1;  // 用於記錄(n-1)!這個數字, 是排列好的所有的序列數量

permutation[len-1]=1;  // 初始化

// 把n=2到len依次填充到陣列裡面

for(intn=2; n<=len; n++) ;  cout << endl;

}; cout << endl;

inttotalnumber=1;

for(inti=2; i<=len; i++) totalnumber*=i;

cout << "tail 20:"<for(inti=totalnumber-20; ifor(intj=0; jcout << (int) p[i*len+j];

};  cout << endl;

}; cout << endl;

deletep;

return0;

// 說明儲存結果是放到一維陣列當中,每個數佔據乙個byte也就是unsigned char型別

// 陣列的長度是 len * len! * sizeof(unsigned char)

// len引數是9的時候,返回到一維陣列的大小就是9*9! = 9*362 880 大約36mb

// 如果是10!  那就再擴大百倍,3.6gb    嘿嘿

全排列 非遞迴

description 列出所有數字1到數字n的連續自然數的排列,要求所產生的任一數字序列中不允許出現得復數字。input 輸入 n 1 n 9 output 由1 n組成的所有不重複的數字序列,每行乙個序列。sample input 3 sample output 1 2 3 1 3 2 2 1 ...

遞迴輸出全排列

輸入整數n n 0,10 按字典序輸出1 n的全排列。解法是暴力排序,核心思想在於依次確定每位數字,確定每位數字的方法相同,故可使用遞迴。每位數字均是從1開始檢驗,確定了一位後進行標記,遞迴進入下一位的確定,遇到已經標記的數字則跳過。字典序的完成 順序的檢查帶來了順序的排列。step記載了每一位上的...

全排列的遞迴與非遞迴

全排列是乙個十分基礎的概念,是一串有可比權值的元素出現的所有排列形式,例如 張全蛋 張蛋全 全張蛋 全蛋 張 蛋全張 蛋張全 就是張全蛋的全排列,所以我們發現全排列用來取名字是很不錯的,如果對每個漢字在名字中的權值做一 張表,再來一張可能出現的不同字同時出現在名字中的關聯權值表,那麼全排列可以算出一...