diff --git a/BaseLib/quicksort.h b/BaseLib/quicksort.h index 57a3aaa1b04cbe92ea0e882e06e7a83c70bbafac..a2dc0da963c22367b639fc89d39af9c42466a191 100644 --- a/BaseLib/quicksort.h +++ b/BaseLib/quicksort.h @@ -21,29 +21,23 @@ namespace BaseLib { template <typename T1, typename T2 = std::size_t> -void quicksort(std::vector<T1>& array, std::size_t beg, std::size_t end, std::vector<T2>& perm) -{ - quicksort(array.data(), beg, end, perm.data()); -} - -template <typename T1, typename T2 = std::size_t> -void quicksort(std::vector<T1*>& array, std::size_t beg, std::size_t end, std::vector<T2>& perm) +void quicksort(T1* array, std::size_t beg, std::size_t end, T2* perm) { // Zip input arrays. - std::vector<std::pair<T1*, T2>> data; + std::vector<std::pair<T1, T2>> data; data.reserve(end-beg); - std::transform(array.begin()+beg, array.begin()+(end-beg), perm.begin()+beg, + std::transform(array+beg, array+(end-beg), perm+beg, std::back_inserter(data), - [](T1* const& t1, T2 const& t2) + [](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) + [](std::pair<T1, T2> const& a, std::pair<T1, T2> const& b) { - return (*a.first < *b.first); + return (a.first < b.first); }); // Unzip sorted data. @@ -55,23 +49,29 @@ void quicksort(std::vector<T1*>& array, std::size_t beg, std::size_t end, std::v } template <typename T1, typename T2 = std::size_t> -void quicksort(T1* array, std::size_t beg, std::size_t end, T2* perm) +void quicksort(std::vector<T1>& array, std::size_t beg, std::size_t end, std::vector<T2>& perm) +{ + quicksort(array.data(), beg, end, perm.data()); +} + +template <typename T1, typename T2 = std::size_t> +void quicksort(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; + std::vector<std::pair<T1*, T2>> data; data.reserve(end-beg); - std::transform(array+beg, array+end, perm+beg, + std::transform(array.begin()+beg, array.begin()+(end-beg), perm.begin()+beg, std::back_inserter(data), - [](T1 const& t1, T2 const& t2) + [](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) + [](std::pair<T1*, T2> const& a, std::pair<T1*, T2> const& b) { - return (a.first < b.first); + return (*a.first < *b.first); }); // Unzip sorted data.