diff --git a/task2/include/quicksort_mt.h b/task2/include/quicksort_mt.h index 6d57e78..b60f0c3 100644 --- a/task2/include/quicksort_mt.h +++ b/task2/include/quicksort_mt.h @@ -20,13 +20,11 @@ public: private: auto parition(std::span &data) -> std::pair, std::span> { - std::vector buf(data); + auto pivot = data.begin(); + std::advance(pivot, std::distance(data.begin(), data.end()) / 2); - auto pivot = buf.begin(); - std::advance(pivot, std::distance(buf.begin(), buf.end()) / 2); - - auto lefti = buf.begin(); - auto righti = buf.end(); + auto lefti = data.begin(); + auto righti = data.end(); while (1) { for (; cmp(*lefti, *pivot); lefti++); @@ -39,7 +37,6 @@ private: std::swap(lefti, righti); } - std::move(buf.begin(), buf.end(), data.begin()); return {std::span(data.begin(), lefti), std::span(lefti, data.end())}; } @@ -54,13 +51,9 @@ private: } } - // Determine mid of data - auto mid = data.begin(); - std::advance(mid, std::distance(data.begin(), data.end()) / 2); - - // Generate left and right view on data (no copies are made here) - std::span left(data.begin(), mid); - std::span right(mid, data.end()); + auto res = parition(data); + auto left = res.first; + auto right = res.second; if (depth < mdepth) { std::thread left_thread([&]() { qsort(left, depth + 1, mdepth); });