C++ Library Extensions 2022.12.09
To help learn modern C++ programming
030-quick_sort.cpp
Go to the documentation of this file.
1#include <tpf_output.hpp>
3
5template<typename Type>
6using list_t = std::list<Type>;
7
8template<typename Type>
9using vector_t = std::vector<Type>;
10
11template<typename Type>
13{
14 if(list.empty())
15 return list;
16
17 auto move_itr =
18 std::make_move_iterator<decltype(list.begin())>;
19
20 list_t<Type> result{ list.front() };
21 list.erase(list.begin());
22
23 auto predicate = [pivot = result.front()] (auto e)
24 {
25 return e < pivot;
26 };
27
28 auto itr = std::partition(list.begin(), list.end(), predicate);
29
30 auto lower = sequential_quick_sort(list_t<Type>{list.begin(), itr});
31 auto higher = sequential_quick_sort(list_t<Type>{itr, list.end()});
32
33 result.insert(result.begin(), move_itr(lower.begin()),
34 move_itr(lower.end()));
35
36 result.insert(result.end(),
37 move_itr(higher.begin()),
38 move_itr(higher.end()));
39
40 return result;
41}
42
43template<typename Type>
45{
46 if(list.empty())
47 return list;
48
49 auto move_itr =
50 std::make_move_iterator<decltype(list.begin())>;
51
52 list_t<Type> result;
53 result.splice(result.end(), list, list.begin());
54
55 auto predicate = [pivot = result.front()] (auto e)
56 {
57 return e < pivot;
58 };
59
60 auto itr = std::partition(list.begin(), list.end(), predicate);
61
62 list_t<Type> lower_part;
63 lower_part.splice(lower_part.end(), list, list.begin(), itr);
64 auto& high_part = list;
65
66 auto lower = sequential_quick_sort( std::move(lower_part) );
67 auto higher = sequential_quick_sort( std::move(high_part) );
68
69 result.insert(result.begin(), move_itr(lower.begin()),
70 move_itr(lower.end()));
71
72 result.insert(result.end(),
73 move_itr(higher.begin()),
74 move_itr(higher.end()));
75
76 return result;
77}
78
80{
81 using element_t = int;
82 using list_t = std::list<element_t>;
83
84 list_t lst{5, 7, 3, 4, 1, 9, 2, 8, 10, 6};
85
87
88}
89
90template<typename ElementType>
92{
93 if(container.empty())
94 return container;
95
96 vector_t<ElementType> result{ container.front() };
97 container.erase(container.begin());
98
99 auto predicate = [pivot = result.front()] (const auto& e)
100 {
101 return e < pivot;
102 };
103
104 auto itr = std::partition(container.begin(), container.end(), predicate);
105
106
107 auto lower_part = vector_t<ElementType>
108 { std::make_move_iterator(container.begin()), std::make_move_iterator(itr)};
109
110 auto higher_part = vector_t<ElementType>
111 { std::make_move_iterator(itr), std::make_move_iterator(container.end()) };
112
113 auto sorted_lower = sequential_quick_sort(std::move(lower_part));
114 auto sorted_higher = sequential_quick_sort(std::move(higher_part));
115
116 result.insert(result.begin(),
117 std::make_move_iterator(sorted_lower.begin()),
118 std::make_move_iterator(sorted_lower.end()));
119
120 result.insert(result.end(),
121 std::make_move_iterator(sorted_higher.begin()),
122 std::make_move_iterator(sorted_higher.end()));
123
124 return result;
125}
126
127template<typename ElementType>
129{
130 if(container.empty())
131 return container;
132
133 vector_t<ElementType> result{ container.back() };
134 container.pop_back();
135
136 auto predicate = [pivot = result.front()] (const auto& e)
137 {
138 return e < pivot;
139 };
140
141 auto itr = std::partition(container.begin(), container.end(), predicate);
142
143 auto move_iterator = std::make_move_iterator<decltype(container.begin())>;
144
145 auto lower_part = vector_t<ElementType>
146 { move_iterator(container.begin()), move_iterator(itr)};
147
148 auto higher_part = vector_t<ElementType>
149 { move_iterator(itr), move_iterator(container.end()) };
150
151 auto sorted_lower = sequential_quick_sort(std::move(lower_part));
152 auto sorted_higher = sequential_quick_sort(std::move(higher_part));
153
154 result.insert(result.begin(),
155 move_iterator(sorted_lower.begin()),
156 move_iterator(sorted_lower.end()));
157
158 result.insert(result.end(),
159 move_iterator(sorted_higher.begin()),
160 move_iterator(sorted_higher.end()));
161
162 return result;
163}
164
166{
167 vector_t<int> container{5, 7, 3, 4, 1, 9, 2, 8, 10, 6};
168
169 stream << sequential_quick_sort_vector(std::move(container)) << tpf::endl;
170
171}
172
173int main()
174{
176}
vector_t< ElementType > sequential_quick_sort_vector(vector_t< ElementType > container)
tpf::sstream stream
std::list< Type > list_t
void example_sequential_quick_sort_vector()
list_t< Type > sequential_quick_sort(list_t< Type > list)
list_t< Type > sequential_quick_sort_splice(list_t< Type > list)
void example_sequential_quick_sort()
int main()
std::vector< Type > vector_t
constexpr auto endl
Definition: tpf_output.hpp:973
Stream output operators << are implemented.