数组全排列算法实现和组合算法实现

来源:互联网 发布:淘宝代运营网站 编辑:程序博客网 时间:2024/05/10 21:54

实现vector容器中数据的全排列和组合。
全排列是指所有元素的组合种类,比如某数组中有元素为1,2,3三个元素,那么这个数组的全排列是
1,2,3
1,3,2
2,1,3
2,3,1
3,2,1
3,1,2
而1,2,3的组合则有
1,2,3
1,2
1,3
1,
2,3
2,
3
为此,用递归实现了两个函数getPermutation()和getCombine()函数分别来实现这样的算法,代码如下:

# include <iostream># include <vector>using namespace std;void getPermutation(vector<int> &nums, vector<vector<int> > &ans, int begin, int end){    if (nums.empty())        return;    if (begin > end)    {        vector<int> temp;        for (unsigned int i = 0; i < nums.size(); ++i)            temp.push_back(nums[i]);        ans.push_back(temp);    }    else    {        for (int i = begin; i <= end; ++i)        {            swap(nums[begin], nums[i]);            getPermutation(nums, ans, begin+1, end);            swap(nums[begin], nums[i]);        }    }}void printAns(const vector<vector<int> > &ans){    for (unsigned int i = 0; i < ans.size(); ++i)    {        for (unsigned int j = 0; j < ans[i].size(); ++j)        {            cout << ans[i][j];        }        cout << endl;    }}void getCombine(vector<int> &nums, vector<vector<int> > &ans, int begin, int end, vector<bool> &flag){    if (nums.size() <= 0)        return;    if (begin > end)    {        vector<int> temp;        for (unsigned int i = 0; i < nums.size(); ++i)            if (flag[i] == true)                temp.push_back(nums[i]);        if (temp.size() != 0) //因为有全false状态,不会输出,所以这里要有一个判断            ans.push_back(temp);    }    else    {        flag[begin] = true;        getCombine(nums, ans, begin+1, end, flag);        flag[begin] = false;        getCombine(nums, ans, begin+1, end, flag);    }}int main(void){    int nums_temp[] = {1, 2, 3};    vector<int> nums(nums_temp, nums_temp + 3);    vector<bool> flag(3, false);    vector<vector<int> > ans;    getPermutation(nums, ans, 0, nums.size() - 1);    cout << "permutation is: " << endl;    printAns(ans);    ans.clear();    cout << "combine is: " << endl;    getCombine(nums, ans, 0, nums.size() - 1, flag);    printAns(ans);}

对于全排列算法,递归函数必必需要传入的参数有数组,指向第一个元素的指针,指向最后一个元素的指针,如果希望将结果保存在一个容器中,还需传入一个二维vector。
对于组合算法,递归函数所传入的参数要比全排列多一个flag数组。
它们的递归结束条件均为begin > end。而递归条件,对于全排列来说,需要依次将元素和第一个元素替换然后递归。对于组合来说,首先需要修改flag数组,将其设置为true,然后递归调用,当递归返回时,恢复flag,然后向后递归。
若有不对之处,敬请指正。

0 0
原创粉丝点击