• 合并两个有序数组(C++)


    合并两个有序数组

    思路

    • 存在一个数组为空,则直接返回另一个(非)空数组。
    • 都不为空

    两个数组都非空:记两个数组分别为v1,v2,合并后的数组为vc,设置两个指针i、j分别指向数组v1,v2,令i=j=0,

    若v1[i] <= v2[j],则可以一直添加v1的元素到合并后的数组vc直到条件不满足,同时修改i;

    添加v2的元素到vc;

    如果一个数组被遍历完,则应该终止;

    添加未遍历完的数组的其余元素到vc。

    代码

     1 vector<int> merge(vector<int> &v1, vector<int> &v2)
     2 {
     3     if(v1.empty()) return v2;
     4     if(v2.empty()) return v1;
     5     
     6     vector<int> r;
     7     unsigned int i = 0,j = 0;
     8     while(i < v1.size() && j < v2.size())
     9     {
    10         while(v1[i]<=v2[j] && i < v1.size())
    11         {
    12             r.push_back(v1[i]);
    13             i++;
    14         }
    15         while(v1[i]>=v2[j] && j < v2.size())
    16         {
    17             r.push_back(v2[j]);
    18             j++;
    19         }
    20     }
    21     while(i<v1.size()) 
    22     {
    23         r.push_back(v1[i]);
    24         i++;
    25     }
    26     while(j<v2.size()) 
    27     {
    28         r.push_back(v2[j]);
    29         j++;
    30     }
    31     
    32     return r;
    33 }

    测试代码

     1 #include <iostream>
     2 #include <vector>
     3 #include <cassert>
     4 using namespace std;
     5 void printVec(const vector<int> &v)
     6 {
     7     for(auto &x: v)
     8         cout << x << ' ';
     9     cout << endl;
    10 }
    11 
    12 // 每次遍历使当前元素最小,第二次为次最小,...
    13 vector<int> sortAscend(vector<int> &v)
    14 {
    15     vector<int> r = v;
    16     for(size_t i = 0; i < r.size(); i++)
    17     {
    18         for(size_t j = i+1; j < r.size(); j++)
    19         {
    20             if(r[i] > r[j])
    21             {
    22                 int t = r[j];
    23                 r[j] = r[i];
    24                 r[i] = t;
    25             }
    26         }
    27         // printVec(r);
    28     }
    29     return r;
    30 }
    31  
    32 int main()
    33 {
    34     std::vector<int> v1 = {7, 5, 16, 5, 8, 1,2}, v1r;
    35     std::vector<int> v2 = {3,3,6,3,0,1,0}, v2r;
    36     v1r = sortAscend(v1);
    37     cout << "-----------------------------" << endl;
    38     v2r = sortAscend(v2);
    39     vector<int> r = merge(v1r, v2r);
    40     printVec(v1r);
    41     printVec(v2r);
    42     printVec(r);
    43     assert(r.size() == v1r.size()+v2r.size());
    44 }
  • 相关阅读:
    poj 1015 Jury Compromise(背包+方案输出)
    最长公共上升子序列 (poj 2127) (Greatest Common Increasing Subsequence)
    轮廓线DP:poj 2279 Mr. Young's Picture Permutations
    LCS的几种求法
    POJ 1737 Connected Graph(高精度+DP递推)
    Cats transport(codeforces311B)(斜率优化)
    高精度(压位+判负数+加减乘+读写)
    洛谷 P2257 YY的GCD
    [POI2007]ZAP-Queries (莫比乌斯反演+整除分块)
    [SDOI2010]古代猪文 (欧拉,卢卡斯,中国剩余)
  • 原文地址:https://www.cnblogs.com/xikeguanyu/p/11296633.html
Copyright © 2020-2023  润新知