您的位置:首页 > 其它

两个有序数组交集与并集的实现

2013-10-27 22:12 579 查看
有序数组的交集:分别从前向后遍历,如果相等则保存,否则将较小数对应的数组向后继续遍历,直到有一个数组遍历结束.

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: