Seredenko-V

MergeSort

Aug 8th, 2022
310
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.92 KB | None | 0 0
  1. // Ускорьте с помощью параллельности
  2. template <typename RandomIt>
  3. void MergeSort(RandomIt range_begin, RandomIt range_end) {
  4.     static size_t count_thread = 0;
  5.     // 1. Если диапазон содержит меньше 2 элементов, выходим из функции
  6.     int64_t range_length = range_end - range_begin;
  7.     if (range_length < 2) {
  8.         return;
  9.     }
  10.  
  11.     // 2. Создаём вектор, содержащий все элементы текущего диапазона
  12.     vector elements(range_begin, range_end);
  13.     // Тип элементов — typename iterator_traits<RandomIt>::value_type
  14.  
  15.     // 3. Разбиваем вектор на две равные части
  16.     auto mid = elements.begin() + range_length / 2;
  17.  
  18.     // 4. Вызываем функцию MergeSort от каждой половины вектора
  19.     if (thread::hardware_concurrency() > count_thread) {
  20.         future<void> first_part = async([&elements, &mid] { MergeSort(elements.begin(), mid); });
  21.         ++count_thread;
  22.     } else {
  23.         MergeSort(elements.begin(), mid);
  24.     }
  25.  
  26.     if (thread::hardware_concurrency() > count_thread) {
  27.         future<void> second_part = async([&elements, &mid] { MergeSort(mid, elements.end()); });
  28.         ++count_thread;
  29.     } else {
  30.         MergeSort(mid, elements.end());
  31.     }
  32.     // 5. С помощью алгоритма merge сливаем отсортированные половины
  33.     // в исходный диапазон
  34.     // merge -> http://ru.cppreference.com/w/cpp/algorithm/merge
  35.  
  36.     //if (thread::hardware_concurrency() > count_thread) {
  37.     //    future<void> merg = async([&elements, mid, range_begin] { merge(elements.begin(), mid, mid, elements.end(), range_begin); });
  38.     //    ++count_thread;
  39.     //}
  40.     merge(elements.begin(), mid, mid, elements.end(), range_begin);
  41.     --count_thread;
  42. }
Advertisement
Add Comment
Please, Sign In to add comment