giGii

asmsort

Jan 3rd, 2023
140
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.04 KB | None | 0 0
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <numeric>
  4. #include <random>
  5. #include <vector>
  6. #include <future>
  7.  
  8. using namespace std;
  9.  
  10. constexpr int MAX_ASYNC_DEPTH = 4;
  11.  
  12. template <typename It>
  13. void PrintRange(It range_begin, It range_end) {
  14.     for (auto it = range_begin; it != range_end; ++it) {
  15.         cout << *it << " "s;
  16.     }
  17.  
  18.     cout << endl;
  19. }
  20.  
  21. // Ускорьте с помощью параллельности
  22. template <typename RandomIt>
  23. void MergeSort(RandomIt range_begin, RandomIt range_end, size_t depth = 0) {
  24.     // 1. Если диапазон содержит меньше 2 элементов, выходим из функции
  25.     int range_length = range_end - range_begin;
  26.     if (range_length < 2) {
  27.         return;
  28.     }
  29.  
  30.     // 2. Создаём вектор, содержащий все элементы текущего диапазона
  31.     vector elements(range_begin, range_end);
  32.     // Тип элементов — typename iterator_traits<RandomIt>::value_type
  33.  
  34.     // 3. Разбиваем вектор на две равные части
  35.     auto mid = elements.begin() + range_length / 2;
  36.  
  37.     // 4. Вызываем функцию MergeSort от каждой половины вектора
  38.     if (depth < MAX_ASYNC_DEPTH) {
  39.         auto left = async([&elements, mid, depth] { MergeSort(elements.begin(), mid, depth + 1); });
  40.         auto right = async([&elements, mid, depth] { MergeSort(mid, elements.begin(), depth + 1); });
  41.         left.get();
  42.         right.get();
  43.     } else {
  44.         MergeSort(elements.begin(), mid, depth + 1);
  45.         MergeSort(mid, elements.begin(), depth + 1);
  46.     }
  47.  
  48.  
  49.     // 5. С помощью алгоритма merge сливаем отсортированные половины
  50.     // в исходный диапазон
  51.     // merge -> http://ru.cppreference.com/w/cpp/algorithm/merge
  52.     merge(elements.begin(), mid, mid, elements.end(), range_begin);
  53. }
  54.  
  55. int main() {
  56.     mt19937 generator;
  57.  
  58.     vector<int> test_vector(10);
  59.  
  60.     // iota             -> http://ru.cppreference.com/w/cpp/algorithm/iota
  61.     // Заполняет диапазон последовательно возрастающими значениями
  62.     iota(test_vector.begin(), test_vector.end(), 1);
  63.  
  64.     // shuffle   -> https://ru.cppreference.com/w/cpp/algorithm/random_shuffle
  65.     // Перемешивает элементы в случайном порядке
  66.     shuffle(test_vector.begin(), test_vector.end(), generator);
  67.  
  68.     // Выводим вектор до сортировки
  69.     PrintRange(test_vector.begin(), test_vector.end());
  70.  
  71.     // Сортируем вектор с помощью сортировки слиянием
  72.     MergeSort(test_vector.begin(), test_vector.end());
  73.  
  74.     // Выводим результат
  75.     PrintRange(test_vector.begin(), test_vector.end());
  76.  
  77.     // Проверяем, можно ли передать указатели
  78.     MergeSort(test_vector.data(), test_vector.data() + test_vector.size());
  79.  
  80.     return 0;
  81. }
Advertisement
Add Comment
Please, Sign In to add comment