两个有序数组交集与并集的实现
2013-10-27 22:12
579 查看
有序数组的交集:分别从前向后遍历,如果相等则保存,否则将较小数对应的数组向后继续遍历,直到有一个数组遍历结束.
有序数组的并集:分别从前向后遍历,如果相等则保存并将两数组同时向后继续遍历;如果不相等,则保存较小的再将对应的数组向后继续遍历,直到有一个数组遍历结束再处理未遍历结束的数组全部保存.
完整的C++实现代码如下:
void intersection(const vector<int>& v1,const vector<int>& v2,vector<int>& des)//求交集 { int i,j; i = j = 0;//定位到2个有序向量的头部 des.clear(); while(i < v1.size() && j < v2.size()) { if(v1[i] == v2[j]) //相等则为交集的元素之一 { des.push_back(v1[i]); i += 1; j += 1; } else if(v1[i] < v2[j]) //不相等时,指示较小元素标记加一 { i += 1; } else { j += 1; } } }
有序数组的并集:分别从前向后遍历,如果相等则保存并将两数组同时向后继续遍历;如果不相等,则保存较小的再将对应的数组向后继续遍历,直到有一个数组遍历结束再处理未遍历结束的数组全部保存.
void unionsection(const vector<int>& v1,const vector<int>& v2,vector<int>& des)//求并集 { int i,j; i = j = 0;//定位到2个有序向量的头部 des.clear(); //必有一个向量插入完成 while(i < v1.size() && j < v2.size()) { if(v1[i] == v2[j]) { des.push_back(v1[i]);//相等则只压入容器一次,标记均后移一个位置,避免元素重复 i += 1; j += 1; } else if(v1[i] < v2[j])//不相等则压入较小元素,标记后移一个位置 { des.push_back(v1[i]); i += 1; } else { des.push_back(v2[j]); j += 1; } } //对于部分未能压入向量中的元素,此处继续操作 while(i < v1.size()) { des.push_back(v1[i]); i++; } while(j < v2.size()) { des.push_back(v2[j]); j++; } }
完整的C++实现代码如下:
#include <iostream> #include <algorithm> #include <iterator> #include <vector> using namespace std; void intersection(const vector<int>& v1,const vector<int>& v2,vector<int>& des)//求交集 { int i,j; i = j = 0;//定位到2个有序向量的头部 des.clear(); while(i < v1.size() && j < v2.size()) { if(v1[i] == v2[j]) //相等则为交集的元素之一 { des.push_back(v1[i]); i += 1; j += 1; } else if(v1[i] < v2[j]) //不相等时,指示较小元素标记加一 { i += 1; } else { j += 1; } } } void unionsection(const vector<int>& v1,const vector<int>& v2,vector<int>& des)//求并集 { int i,j; i = j = 0;//定位到2个有序向量的头部 des.clear(); //必有一个向量插入完成 while(i < v1.size() && j < v2.size()) { if(v1[i] == v2[j]) { des.push_back(v1[i]);//相等则只压入容器一次,标记均后移一个位置,避免元素重复 i += 1; j += 1; } else if(v1[i] < v2[j])//不相等则压入较小元素,标记后移一个位置 { des.push_back(v1[i]); i += 1; } else { des.push_back(v2[j]); j += 1; } } //对于部分未能压入向量中的元素,此处继续操作 while(i < v1.size()) { des.push_back(v1[i]); i++; } while(j < v2.size()) { des.push_back(v2[j]); j++; } } //示例程序 int main() { vector<int> v1; vector<int> v2; vector<int> des; v1.push_back(5); v1.push_back(7); v1.push_back(9); v1.push_back(11); v1.push_back(15); v1.push_back(20); v1.push_back(28); v2.push_back(10); v2.push_back(11); v2.push_back(12); v2.push_back(13); v2.push_back(14); v2.push_back(15); v2.push_back(19); sort(v1.begin(),v1.end()); sort(v2.begin(),v2.end()); intersection(v1,v2,des); //交集 int i=0; while(i< des.size()) { cout<<des[i]<<endl; i++; } cout<<endl; unionsection(v1,v2,des); //并集 i=0; while(i< des.size()) { cout<<des[i]<<endl; i++; } cout<<endl; system("pause"); return 0; }
相关文章推荐
- 【Java】实现浮点数组的并集以及整型数组的交集和两个字符串数组的逆序排序
- 递增有序的顺序表表示集合,求解两个集合的交集 并集 差集(c语言实现)
- 求两个数组的交集、并集和差集算法分析与实现
- 求两个数组的交集、并集和差集算法分析与实现(转自http://blog.sina.com.cn/s/blog_616e189f0100mrdn.html)
- 求两个数组的交集、并集和差集算法分析与实现
- 求两个集合的交集以及求两个有序数组并集的第k小元素
- 求两个数组的交集、并集和差集算法分析与实现
- 两个数组并集 交集 差集的算法思想与实现
- Java实现数组的交集、并集、差集
- Python 两个列表的差集、并集和交集实现代码
- C++实现:合并两个有序的数组,合并后的数组依然有序
- PHP实现对数组简单求交集,差集,并集功能示例
- 程序员面试题目总结--数组(二)【二分查找、找出给定数字出现次数、两个有序整型数组交集、找出数组中唯一的重复元素、判断数组中的数值是否连续相邻】
- C#控制台基础 两个int类型数组,求交集,并集,差集
- 求两个有序数组的交集
- Python 两个列表的差集、并集和交集实现代码
- 求两个有序整型数组的交集
- 两个数组的交集,并集,差集。
- 两个有序数组求交集
- C语言实现:合并两个有序的数组,合并后的数组依然有序