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

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

void intersection(const vector& v1,const vector& v2,vector& 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& v1,const vector& v2,vector& 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     
#include   
#include     
#include   
using namespace std;  
  
  
void intersection(const vector& v1,const vector& v2,vector& 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& v1,const vector& v2,vector& 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 v1;  
        vector v2;  
        vector 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<


你可能感兴趣的:(C/C++)