合并两个有序数组(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 }

 

posted @ 2019-08-03 22:44  xikeHu  阅读(2493)  评论(0编辑  收藏  举报