Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <algorithm>
- #include <iostream>
- #include <numeric>
- #include <random>
- #include <vector>
- #include <future>
- #include <execution>
- using namespace std;
- template <typename It>
- void PrintRange(It range_begin, It range_end) {
- for (auto it = range_begin; it != range_end; ++it) {
- cout << *it << " "s;
- }
- cout << endl;
- }
- template <typename RandomIt>
- void MergeSort(RandomIt range_begin, RandomIt range_end, int async_ = 0) {
- int range_length = range_end - range_begin;
- if (range_length < 2) {
- return;
- }
- vector elements(range_begin, range_end);
- auto mid = elements.begin() + range_length / 2;
- auto right = [mid, end = elements.end(), async_] {
- MergeSort(mid, end, 1 + async_);
- };
- auto left = [begin = elements.begin(), mid, async_] {
- MergeSort(begin, mid, 1 + async_);
- };
- if (2 >= async_) { //max_async
- auto right_async = async(right);
- left();
- right_async.get();
- } else {
- right();
- left();
- }
- merge(execution::par, elements.begin(), mid, mid, elements.end(), range_begin);
- }
- int main() {
- mt19937 generator;
- vector<int> test_vector(10);
- iota(test_vector.begin(), test_vector.end(), 1);
- shuffle(test_vector.begin(), test_vector.end(), generator);
- PrintRange(test_vector.begin(), test_vector.end());
- MergeSort(test_vector.begin(), test_vector.end());
- PrintRange(test_vector.begin(), test_vector.end());
- MergeSort(test_vector.data(), test_vector.data() + test_vector.size());
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment