OGS
quicksort.h
Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (c) OpenGeoSys Community (opengeosys.org)
2// SPDX-License-Identifier: BSD-3-Clause
3
4#pragma once
5
6#include <algorithm>
7#include <cassert>
8#include <cstddef>
9#include <iterator>
10#include <vector>
11
12namespace BaseLib
13{
16template <typename It1, typename It2, typename Comparator>
17void quicksort(It1 first1, It1 last1, It2 first2, Comparator compare)
18{
19 using T1 = typename std::iterator_traits<It1>::value_type;
20 using T2 = typename std::iterator_traits<It2>::value_type;
21
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); });
27
28 // Sort data using first element of the pair.
29 std::sort(begin(data), end(data), compare);
30
31 // Unzip sorted data.
32 for (auto const& pair : data)
33 {
34 *first1 = pair.first;
35 *first2 = pair.second;
36 ++first1;
37 ++first2;
38 }
39}
40
42template <typename It1, typename It2>
43void quicksort(It1 first1, It1 last1, It2 first2)
44{
45 using T1 = typename std::iterator_traits<It1>::value_type;
46 using T2 = typename std::iterator_traits<It2>::value_type;
47
48 quicksort(first1, last1, first2,
49 [](std::pair<T1, T2> const& a, std::pair<T1, T2> const& b)
50 { return a.first < b.first; });
51}
52
54template <typename T1, typename T2 = std::size_t>
55void quicksort(T1* array, std::size_t beg, std::size_t end, T2* perm)
56{
57 assert(beg <= end);
58
59 quicksort(array + beg, array + end, perm + beg);
60}
61
62template <typename T1, typename T2 = std::size_t>
63void quicksort(std::vector<T1>& array, std::size_t beg, std::size_t end,
64 std::vector<T2>& perm)
65{
66 assert(beg <= end);
67 assert(end <= array.size());
68 assert(perm.size() == array.size());
69
70 quicksort(array.data(), beg, end, perm.data());
71}
72
73template <typename T1, typename T2 = std::size_t>
74void quicksort(std::vector<T1*>& array, std::size_t beg, std::size_t end,
75 std::vector<T2>& perm)
76{
77 assert(beg <= end);
78 assert(end <= array.size());
79 assert(perm.size() == array.size());
80
81 // Zip input arrays.
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); });
88
89 // Sort data using first element of the pair.
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); });
93
94 // Unzip sorted data.
95 for (std::size_t i = 0; i < data.size(); i++)
96 {
97 array[beg + i] = data[i].first;
98 perm[beg + i] = data[i].second;
99 }
100}
101
102} // end namespace BaseLib
void quicksort(It1 first1, It1 last1, It2 first2, Comparator compare)
Definition quicksort.h:17