loulett

parallel_merge_sort

May 26th, 2016
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.87 KB | None | 0 0
  1. #include <thread>
  2. #include <random>
  3. #include <vector>
  4. #include <iostream>
  5. #include <numeric>
  6. #include <algorithm>
  7. /*
  8. size_t binarySearch(int x, std::vector<int> arr, size_t left, size_t right) {
  9.     if (right <= left)
  10.         return left;
  11.     if (x < arr[left])
  12.         return left;
  13.     while (right - left > 1) {
  14.         size_t mid = (right + left) / 2;
  15.         if (arr[mid] < x)
  16.             left = mid;
  17.         else
  18.             right = mid;
  19.     }
  20.     return right;
  21.  
  22. }*/
  23.  
  24. void merge1(std::vector<int>& arr, size_t left1, size_t right1, size_t left2, size_t right2, std::vector<int>& res, size_t left3) {
  25.     size_t n1 = right1 - left1, n2 = right2 - left2;
  26.     if (n1 < n2) {
  27.         std::swap(left1, left2);
  28.         std::swap(right1, right2);
  29.         std::swap(n1, n2);
  30.     }
  31.     if (n1 == 0) {
  32.         return;
  33.     }
  34.     size_t mid1 = (right1 + left1) / 2;
  35.     size_t mid2 = std::lower_bound(arr.begin() + left2, arr.begin() + right2, arr[mid1]) - arr.begin(); //binarySearch(arr[mid1], arr, left2, right2);
  36.     size_t mid3 = left3 + (mid1 - left1) + (mid2 - left2);
  37.     res[mid3] = arr[mid1];
  38.     std::thread first(merge1, std::ref(arr), left1, mid1, left2, mid2, std::ref(res), left3);
  39.     std::thread second(merge1, std::ref(arr), mid1 + 1, right1, mid2, right2, std::ref(res), mid3 + 1);
  40.     first.join();
  41.     second.join();
  42. }
  43.  
  44. void merge(std::vector<int>& arr, size_t left, size_t mid, size_t right) {
  45.     std::vector<int> res(right - left);
  46.     merge1(arr, left, mid, mid, right, res, 0);
  47.     for (size_t i = left; i < right; i++) {
  48.         arr[i] = res[i - left];
  49.     }
  50. }
  51.  
  52. void mergeSort(std::vector<int>& arr, size_t left, size_t right)
  53. {
  54.     if (right - left <= 1)
  55.         return;
  56.  
  57.     size_t mid = (right + left) / 2;
  58.     std::thread first(mergeSort, std::ref(arr), left, mid);
  59.     std::thread second(mergeSort, std::ref(arr), mid, right);
  60.     first.join();
  61.     second.join();
  62.     merge(arr, left, mid, right);
  63. }
  64.  
  65. int main() {
  66.     std::vector<int> arr = { 5,4,3,2,1 };
  67.     mergeSort(arr, 0, arr.size());
  68.     return 0;
  69. }
Advertisement
Add Comment
Please, Sign In to add comment