zoukankan      html  css  js  c++  java
  • 合并两个有序数组(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 }
  • 相关阅读:
    工作后对单元测试学习的一点总结
    图片做按钮会将form表单自动提交
    转jMock Cookbook 中文版三
    转jMock Cookbook 中文版二
    转jMock Cookbook 中文版一
    JUnit4学习笔记(五):Theory(理论)测试
    JUnit4学习笔记(四):利用Rule扩展JUnit
    JUnit4学习笔记(三):assertThat语法与Matcher
    JUnit4学习笔记(二):参数化测试与假定(Assumption)
    junit学习一
  • 原文地址:https://www.cnblogs.com/xikeguanyu/p/11296633.html
Copyright © 2011-2022 走看看