Petrovi4

AsyncMergeSort

Aug 24th, 2022
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.99 KB | None | 0 0
  1. #include <algorithm>
  2. #include <execution>
  3. #include <future>
  4. #include <numeric>
  5. #include <vector>
  6.  
  7. using namespace std;
  8.  
  9. constexpr int MAX_ASYNC_DEPTH = 2;
  10.  
  11. template <typename RandomIt>
  12. void MergeSort(RandomIt range_begin, RandomIt range_end, int depth = 0) {
  13.     const int range_length = range_end - range_begin;
  14.     if (range_length < 2) {
  15.         return;
  16.     }
  17.  
  18.     vector elements(range_begin, range_end);
  19.  
  20.     const auto mid = elements.begin() + range_length / 2;
  21.  
  22.     auto left_task = [start = elements.begin(), mid, depth] {
  23.         MergeSort(start, mid, depth + 1);
  24.     };
  25.     auto right_task = [mid, finish = elements.end(), depth] {
  26.         MergeSort(mid, finish, depth + 1);
  27.     };
  28.  
  29.     if (depth <= MAX_ASYNC_DEPTH) {
  30.         auto left_future = async(left_task);
  31.         right_task();
  32.         left_future.get();
  33.     } else {
  34.         left_task();
  35.         right_task();
  36.     }
  37.  
  38.     merge(execution::par, elements.begin(), mid, mid, elements.end(), range_begin);
  39. }
Add Comment
Please, Sign In to add comment