您的位置:首页 > 其它

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

2016-08-31 17:14 483 查看
实现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,然后向后递归。

若有不对之处,敬请指正。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  全排列 组合 算法