Zorikto

mergesort

Apr 25th, 2021 (edited)
909
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.29 KB | None | 0 0
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <vector>
  4. #include <iterator>
  5. #include <thread>
  6. #include <math.h>
  7. #include <time.h>
  8.  
  9. using namespace std;
  10.  
  11. typedef vector<int>::iterator it;
  12.  
  13. vector<int > buf(99999999);
  14. vector<int > v;
  15.  
  16. void merge_sort(it l, it r){
  17.     int d = distance(l, r);
  18.     if(d<2) return;
  19.     it m = l+d/2;
  20.  
  21.     it bufl = buf.begin() + (l - v.begin()), bufr = buf.begin() + (r - v.begin());
  22.  
  23.     merge_sort(l, m);
  24.     merge_sort(m, r);
  25.  
  26.     merge(l, m, m, r, bufl);
  27.     copy(bufl, bufr, l);
  28. }
  29.  
  30. void p_merge_sort(vector<int > &v){
  31.     vector<thread > threads(4);
  32.     int d=ceil(v.size()/4.);
  33.  
  34. //    vector<thread > threads(2);
  35. //    int d=ceil(v.size()/2.);
  36.     it l=v.begin(), r=v.begin()+d;
  37.     for(int i=0; i<4; i++){
  38.         threads[i]=thread(merge_sort,l, r);
  39.         advance(l, d);
  40.         if(i<2)
  41.             r=l+d;
  42.         else
  43.             r=v.end();
  44.     }
  45. //    for(int i=0; i<2; i++){
  46. //        threads[i]=thread(merge_sort,l, r);
  47. //        advance(l, d);
  48. //        if(i<2)
  49. //        {
  50. //            r=l + d;
  51. //        }
  52. //        else
  53. //        {
  54. //            r=v.end();
  55. //        }
  56. //    }
  57.  
  58.     for(int i=0; i<4; i++)
  59.         threads[i].join();
  60. //    for(int i=0; i<2; i++)
  61. //        threads[i].join();
  62.  
  63.     merge(v.begin(), v.begin()+d, v.begin()+d,
  64.           v.begin()+2*d, buf.begin());
  65.  
  66.     merge(v.begin()+2*d, v.begin()+3*d, v.begin()+3*d,
  67.           v.end(), buf.begin()+2*d);
  68.  
  69.     merge(buf.begin(), buf.begin()+2*d,
  70.           buf.begin()+2*d, buf.begin()+v.size(), v.begin());
  71.  
  72. //    merge(v.begin(), v.begin()+d, v.begin()+d,
  73. //////          v.begin()+2*d, buf.begin());
  74. ////
  75. ////    merge(buf.begin(), buf.begin()+2*d,
  76. //          buf.begin()+2*d, buf.begin()+v.size(), v.begin());
  77. }
  78.  
  79. int main(){
  80.     int n;
  81.     cin>>n;
  82.     for(int j = 0; j < 10; j++)
  83.     {
  84.         for(int i = 0; i < n; i++){
  85.             v.push_back(i);
  86.         }
  87.         for(int i = 0; i < n-1; i++){
  88.             swap(v[i], v[rand() % (n - i - 1) + i + 1]);
  89.         }
  90.         clock_t begin = clock();
  91.         p_merge_sort(v);
  92. //        merge_sort(v.begin(), v.end());
  93.         clock_t end = clock();
  94.         double time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
  95.     //
  96.         cout << time_spent << '\n';
  97.     }
  98.     return 0;
  99. }
  100.  
Add Comment
Please, Sign In to add comment