数组全排列算法实现和组合算法实现
来源:互联网 发布:淘宝代运营网站 编辑:程序博客网 时间: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
- 数组全排列算法实现和组合算法实现
- 全排列和组合的实现算法
- 全排列和组合的实现算法
- 全排列和组合算法的C#语言实现
- Java实现全排列、组合算法
- 数组全排列算法的python实现
- 全排列算法实现
- 全排列算法原理和实现
- 全排列算法原理和实现
- 全排列算法原理和实现
- 全排列算法原理和实现
- 全排列算法原理和实现
- 全排列的算法思想和实现
- 全排列算法原理和实现
- 全排列算法原理和实现
- 全排列算法思想和实现
- 全排列算法原理和实现
- FreeEIM 全排列算法原理和实现
- Thread类
- tjut 3529
- 对于unsigned的数据类型
- 【龙印】龙芯1c的gpio输出高低电平的linux驱动
- 简述 对UITableView的封装 有改进或者错误的地方请各位大大指正
- 数组全排列算法实现和组合算法实现
- C++ 获取URL图片、html文件,CInternetSession
- 2016半年总——还会更好
- gl 错误
- 类操作工具
- LTBezierPath
- 一样前端学习DEMO
- C# Winform工程省市县三级行政区联动2 --可增删县级
- bzoj 1027 [JSOI2007]合金 计算几何+floyd