数组全排列算法实现和组合算法实现
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()函数分别来实现这样的算法,代码如下:
对于全排列算法,递归函数必必需要传入的参数有数组,指向第一个元素的指针,指向最后一个元素的指针,如果希望将结果保存在一个容器中,还需传入一个二维vector。
对于组合算法,递归函数所传入的参数要比全排列多一个flag数组。
它们的递归结束条件均为begin > end。而递归条件,对于全排列来说,需要依次将元素和第一个元素替换然后递归。对于组合来说,首先需要修改flag数组,将其设置为true,然后递归调用,当递归返回时,恢复flag,然后向后递归。
若有不对之处,敬请指正。
全排列是指所有元素的组合种类,比如某数组中有元素为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,然后向后递归。
若有不对之处,敬请指正。
相关文章推荐
- 高效率的排列组合算法(java实现)
- 排列组合算法 的java实现
- 高效率的排列组合算法--《编程珠矶》--python实现
- 经典递归算法之排列,组合,集合和换零钱, Python yield实现.
- c语言实现排列组合算法问题
- C#实现排列组合算法
- 排列和组合算法 C语言经典实现
- 关于数学中排列组合之组合算法实现
- 全排列和组合的实现算法
- 针对较大基数的排列组合算法Java实现类(n选m)
- C#实现排列组合算法
- 关于算法—— 一维字符串数组之间组合问题的C#实现
- 排列和组合算法 C语言经典实现
- 排列组合算法的递归实现
- VB.NET 排列组合算法实现
- 排列与组合的算法实现
- 全排列和组合的实现算法
- 用java实现对数组的排列组合
- 求数组全排列算法的递归实现
- [原创]:排列(组合)算法的实现: