在高中階段我們已經通過大量的習題了解了排列和組合。
但是有時候我們研究的不是由排列和組合算出來的數字,研究的是生成排列和組合。即,把集合中元素所有的排列和組合全部列出來,然後研究這些序列的性質。
今天我用兩種方法講一下如何生成排列。注意我們這裡涉及的順序都是序列的字典序。
序列的字典序:設有兩個序列,第乙個序列為
任何n元素集合都可以與集合建立雙射關係。因此,我們可以通過研究集合的全排列來得到任何n元素集合的全排列。
1.首先找到整數
2. 然後把
中大於
的最小整數放到索引j上去。
3. 最後按遞增順序給j+1到n上的元素排序。
#includeusing namespace std;
int a[1000];
void swap(int &a, int &b)
bool isreverse(int a, int n)
} return true;
}void permutate(int a, int n)
cout << endl;
// 終止條件:數列是降序的
while (!isreverse(a, n))
// 先輸出當前排列
for (int i = 1; i <= n; ++i)
cout << endl;
}}int main()
cout << "the full permuations are:n";
permutate(a, n);
} return 0;
}
這個我們不妨直接舉例說明,假設我們有乙個字串abc,我們對其進行全排列:
字串全排列演算法 遞迴
以字串1234為例 1 一 234 2 一 134 3 一 214 4 一 231 如何才能保證不遺漏呢 如下 includeusing namespace std char str 1234 int size sizeof str sizeof char str 要進行全排列的字元陣列 size ...
字串全排列
依次選出每乙個字元元素,作為排列的第乙個元素,然後對剩餘的元素進行全排列,如此遞迴處理,從而得到所有元素的全排列。以對字串abc進行全排列為例,我們可以這麼做 固定a,求後面bc的排列 abc,acb,求好後,a和b交換,得到bac 固定b,求後面ac的排列 bac,bca,求好後,c放到第一位置,...
字串全排列
如果沒有重複字元 include using namespace std void swap char char void permutation char char int main void swap char a,char b str 整個串 pbegin 後面的字串拉到前面的起始位置 voi...