17void quicksort(It1 first1, It1 last1, It2 first2, Comparator compare)
19 using T1 =
typename std::iterator_traits<It1>::value_type;
20 using T2 =
typename std::iterator_traits<It2>::value_type;
22 std::vector<std::pair<T1, T2>> data;
23 data.reserve(std::distance(first1, last1));
24 std::transform(first1, last1, first2, std::back_inserter(data),
25 [](T1
const& t1, T2
const& t2)
26 {
return std::make_pair(t1, t2); });
29 std::sort(begin(data), end(data), compare);
32 for (
auto const& pair : data)
35 *first2 = pair.second;
63void quicksort(std::vector<T1>& array, std::size_t beg, std::size_t end,
64 std::vector<T2>& perm)
67 assert(end <= array.size());
68 assert(perm.size() == array.size());
70 quicksort(array.data(), beg, end, perm.data());
74void quicksort(std::vector<T1*>& array, std::size_t beg, std::size_t end,
75 std::vector<T2>& perm)
78 assert(end <= array.size());
79 assert(perm.size() == array.size());
82 std::vector<std::pair<T1*, T2>> data;
83 data.reserve(end - beg);
84 std::transform(array.begin() + beg, array.begin() + end, perm.begin() + beg,
85 std::back_inserter(data),
86 [](T1*
const& t1, T2
const& t2)
87 { return std::make_pair(t1, t2); });
90 std::sort(data.begin(), data.end(),
91 [](std::pair<T1*, T2>
const& a, std::pair<T1*, T2>
const& b)
92 { return (*a.first < *b.first); });
95 for (std::size_t i = 0; i < data.size(); i++)
97 array[beg + i] = data[i].first;
98 perm[beg + i] = data[i].second;