Advertisement
SteveStage

Merge Sort

Dec 8th, 2022
550
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.57 KB | Source Code | 0 0
  1. #include <vector>
  2.  
  3. #define MERGE_SORT_DECREASING
  4.  
  5. #if defined MERGE_SORT_INCREASING
  6. #define MERGE_CHECK <=
  7. #elif defined MERGE_SORT_DECREASING
  8. #define MERGE_CHECK >=
  9. #endif
  10.  
  11.  
  12. void merge_sort(std::vector<int>&);
  13.  
  14. std::vector<int> merge(std::vector<int>&, std::vector<int>&);
  15.  
  16. void merge_sort(std::vector<int>& v)
  17. {
  18.     int size = v.size();
  19.     int lgpw = std::log2(size);
  20.     int size2n = std::pow(2, lgpw);
  21.     int dif = size - size2n;
  22.     std::vector<std::vector<int>> vc;
  23.     std::vector<std::vector<int>> vc_df;
  24.     for (int i = 0; i < size2n; i++)
  25.     {
  26.         vc.push_back({ v[i] });
  27.     }
  28.     for (int i = 0; i < dif; i++)
  29.     {
  30.         vc_df.push_back({ v[i + size2n] });
  31.     }
  32.     for (int i = 1; i <= lgpw; i++) // start merging
  33.     {
  34.         int prsz = std::pow(2, i);
  35.         for (int li = 0; li < std::pow(2, (3-i)); li+=2) // offset
  36.         {
  37.             vc[li] = merge(vc[li], vc[li + 1]);
  38.             vc.erase(std::next(vc.begin(), li + 1));
  39.             li--;
  40.         }
  41.     }
  42.     if (dif > 0)
  43.     {
  44.         if (dif % 2 == 0)
  45.         {
  46.             int lgdf = std::log2(dif); // maximum number multiply of 2 less than dif
  47.             for (int i = 1; i <= (lgdf + 1); i++) // + 1 for merge multiply of 2 vector and last vector
  48.             {
  49.                 for (int ii = 0; (ii + 1) < vc_df.size(); ii++)
  50.                 {
  51.                     vc_df[ii] = merge(vc_df[ii], vc_df[ii + 1]);
  52.                     vc_df.erase(std::next(vc_df.begin(), ii+1));
  53.                 }
  54.             }
  55.         }
  56.         v = merge(vc[0], vc_df[0]);
  57.     }
  58.     else
  59.         v = vc[0];
  60. }
  61.  
  62. std::vector<int> merge(std::vector<int>& v1, std::vector<int>& v2)
  63. {
  64.     std::vector<int> tt;
  65.     int c1 = 0, c2 = 0; // counters for 1st and 2nd compared vectors
  66.     while (true)
  67.     {
  68.         if (c1 >= v1.size()) // c1 out of bound
  69.         {
  70.             if (c2 >= v2.size()) // c2 out of bound
  71.                 break;
  72.             else
  73.             {
  74.                 tt.push_back(v2[c2]);
  75.                 c2++;
  76.             }
  77.         }
  78.         else
  79.         {
  80.             if (c2 >= v2.size()) // c2 out of bound
  81.             {
  82.                 tt.push_back(v1[c1]);
  83.                 c1++;
  84.             }
  85.             else
  86.             {
  87.                 if (v1[c1] MERGE_CHECK v2[c2])
  88.                 {
  89.                     tt.push_back(v1[c1]);
  90.                     c1++;
  91.                 }
  92.                 else
  93.                 {
  94.                     tt.push_back(v2[c2]);
  95.                     c2++;
  96.                 }
  97.             }
  98.         }
  99.     }
  100.     return tt;
  101. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement