合並兩個有序數組(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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM