Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Ускорьте с помощью параллельности
- template <typename RandomIt>
- void MergeSort(RandomIt range_begin, RandomIt range_end) {
- static size_t count_thread = 0;
- // 1. Если диапазон содержит меньше 2 элементов, выходим из функции
- int64_t range_length = range_end - range_begin;
- if (range_length < 2) {
- return;
- }
- // 2. Создаём вектор, содержащий все элементы текущего диапазона
- vector elements(range_begin, range_end);
- // Тип элементов — typename iterator_traits<RandomIt>::value_type
- // 3. Разбиваем вектор на две равные части
- auto mid = elements.begin() + range_length / 2;
- // 4. Вызываем функцию MergeSort от каждой половины вектора
- if (thread::hardware_concurrency() > count_thread) {
- future<void> first_part = async([&elements, &mid] { MergeSort(elements.begin(), mid); });
- ++count_thread;
- } else {
- MergeSort(elements.begin(), mid);
- }
- if (thread::hardware_concurrency() > count_thread) {
- future<void> second_part = async([&elements, &mid] { MergeSort(mid, elements.end()); });
- ++count_thread;
- } else {
- MergeSort(mid, elements.end());
- }
- // 5. С помощью алгоритма merge сливаем отсортированные половины
- // в исходный диапазон
- // merge -> http://ru.cppreference.com/w/cpp/algorithm/merge
- //if (thread::hardware_concurrency() > count_thread) {
- // future<void> merg = async([&elements, mid, range_begin] { merge(elements.begin(), mid, mid, elements.end(), range_begin); });
- // ++count_thread;
- //}
- merge(elements.begin(), mid, mid, elements.end(), range_begin);
- --count_thread;
- }
Advertisement
Add Comment
Please, Sign In to add comment