diff --git a/BaseLib/quicksort.h b/BaseLib/quicksort.h index b27883713772c48c70f223d886c1600b770503c5..80824ef7aa9e39d3f4b52f5eb54482af113b2b29 100644 --- a/BaseLib/quicksort.h +++ b/BaseLib/quicksort.h @@ -111,6 +111,35 @@ void quicksort(T1* array, std::size_t beg, std::size_t end, T2* second_array) namespace BaseLib { + +template <typename T1, typename T2 = std::size_t> +void quicksortD(std::vector<T1>& array, std::size_t beg, std::size_t end, std::vector<T2>& perm) +{ + // Zip input arrays. + std::vector<std::pair<T1, T2>> data; + data.reserve(array.size()); + std::transform(array.begin(), array.end(), perm.begin(), + std::back_inserter(data), + [](T1 const& t1, T2 const& t2) + { + return std::make_pair(t1, t2); + }); + + // Sort data using first element of the pair. + std::sort(data.begin(), data.end(), + [](std::pair<T1, T2> const& a, std::pair<T1, T2> const& b) + { + return (a.first < b.first); + }); + + // Unzip sorted data. + for (std::size_t i = 0; i < data.size(); i++) + { + array[i] = data[i].first; + perm[i] = data[i].second; + } +} + template <typename T1, typename T2 = std::size_t> class Quicksort {