Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <algorithm>
- #include <execution>
- #include <future>
- #include <numeric>
- #include <vector>
- using namespace std;
- constexpr int MAX_ASYNC_DEPTH = 2;
- template <typename RandomIt>
- void MergeSort(RandomIt range_begin, RandomIt range_end, int depth = 0) {
- const int range_length = range_end - range_begin;
- if (range_length < 2) {
- return;
- }
- vector elements(range_begin, range_end);
- const auto mid = elements.begin() + range_length / 2;
- auto left_task = [start = elements.begin(), mid, depth] {
- MergeSort(start, mid, depth + 1);
- };
- auto right_task = [mid, finish = elements.end(), depth] {
- MergeSort(mid, finish, depth + 1);
- };
- if (depth <= MAX_ASYNC_DEPTH) {
- auto left_future = async(left_task);
- right_task();
- left_future.get();
- } else {
- left_task();
- right_task();
- }
- merge(execution::par, elements.begin(), mid, mid, elements.end(), range_begin);
- }
Add Comment
Please, Sign In to add comment