MSTL 1.4.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
sort.hpp
浏览该文件的文档.
1#ifndef MSTL_CORE_ALGORITHM_SORT_HPP__
2#define MSTL_CORE_ALGORITHM_SORT_HPP__
3
11
17
23
35template <typename Iterator, typename Compare, enable_if_t<is_ranges_input_iter_v<Iterator>, int> = 0>
36bool is_sorted(Iterator first, Iterator last, Compare comp) {
37 if (first == last) return true;
38 Iterator next = _MSTL next(first);
39 for (; next != last; ++first, ++next) {
40 if (comp(*next, *first)) {
41 return false;
42 }
43 }
44 return true;
45}
46
54template <typename Iterator>
55bool is_sorted(Iterator first, Iterator last) {
56 return is_sorted(first, last, _MSTL less<iter_value_t<Iterator>>());
57}
58
70template <typename Iterator, typename Compare, enable_if_t<is_ranges_input_iter_v<Iterator>, int> = 0>
71Iterator is_sorted_until(Iterator first, Iterator last, Compare comp) {
72 if (first == last) return last;
73 Iterator next = _MSTL next(first);
74 for (; next != last; ++first, ++next) {
75 if (comp(*next, *first))
76 return next;
77 }
78 return last;
79}
80
88template <typename Iterator>
89Iterator is_sorted_until(Iterator first, Iterator last) {
90 return is_sorted_until(first, last, _MSTL less<iter_value_t<Iterator>>());
91}
92
93
107template <typename Iterator, typename Compare, enable_if_t<
109void merge_sort(Iterator first, Iterator last, Compare comp) {
111 if (n < 2) return;
112 Iterator mid = first + n / 2;
113 _MSTL merge_sort(first, mid);
114 _MSTL merge_sort(mid, last);
115 _MSTL inplace_merge(first, mid, last, comp);
116}
117
124template <typename Iterator>
125void merge_sort(Iterator first, Iterator last) {
126 return _MSTL merge_sort(first, last, _MSTL less<iter_value_t<Iterator>>());
127}
128
142template <typename Iterator, typename Compare, enable_if_t<
144void partial_sort(Iterator first, Iterator middle, Iterator last, Compare comp) {
145 if (first == middle) return;
146 _MSTL make_heap(first, middle, comp);
147 for (Iterator i = middle; i < last; ++i) {
148 if (comp(*i, *first)) {
149 _INNER pop_heap_aux(first, middle, i, *i, comp);
150 }
151 }
152 _MSTL sort_heap(first, middle, comp);
153}
154
162template <typename Iterator>
163void partial_sort(Iterator first, Iterator middle, Iterator last) {
164 return _MSTL partial_sort(first, middle, last, _MSTL less<iter_value_t<Iterator>>());
165}
166
181template <typename Iterator1, typename Iterator2, typename Compare, enable_if_t<
183Iterator2 partial_sort_copy(Iterator1 first, Iterator1 last,
184 Iterator2 result_first, Iterator2 result_last, Compare comp) {
185 if (result_first == result_last) return result_last;
186 Iterator2 result_real_last = result_first;
187 while (first != last && result_real_last != result_last) {
188 *result_real_last = *first;
189 ++result_real_last;
190 ++first;
191 }
192 _MSTL make_heap(result_first, result_real_last, comp);
193 while (first != last) {
194 if (comp(*first, *result_first)) {
196 Distance(result_real_last - result_first), *first, comp);
197 }
198 ++first;
199 }
200 _MSTL sort_heap(result_first, result_real_last, comp);
201 return result_real_last;
202}
203
214template <typename Iterator1, typename Iterator2>
215Iterator2 partial_sort_copy(Iterator1 first, Iterator1 last, Iterator2 result_first, Iterator2 result_last) {
216 return _MSTL partial_sort_copy(first, result_first, result_last, _MSTL less<iter_value_t<Iterator1>>());
217}
218
221
233template <typename Iterator, typename T, typename Compare>
234void __insertion_sort_aux(Iterator last, T value, Compare comp) {
235 Iterator next = last;
236 --next;
237 while (comp(value, *next)) {
238 *last = *next;
239 last = next;
240 --next;
241 }
242 *last = value;
243}
244
247
260template <typename Iterator, typename Compare, enable_if_t<
262void insertion_sort(Iterator first, Iterator last, Compare comp) {
263 if (first == last) return;
264 for (Iterator i = first + 1; i != last; ++i) {
265 iter_value_t<Iterator> value = *i;
266 if (comp(value, *first)) {
267 _MSTL copy_backward(first, i, i + 1);
268 *first = value;
269 } else {
270 _INNER __insertion_sort_aux(i, value, comp);
271 }
272 }
273}
274
281template <typename Iterator>
282void insertion_sort(Iterator first, Iterator last) {
283 return _MSTL insertion_sort(first, last, _MSTL less<iter_value_t<Iterator>>());
284}
285
300template <typename Iterator, typename Compare, enable_if_t<
302void introspective_sort(Iterator first, Iterator last, int depth_limit, Compare comp) {
303 while (first < last) {
304 if (depth_limit == 0) {
305 _MSTL partial_sort(first, last, last, comp);
306 return;
307 }
308 --depth_limit;
309 Iterator cut = _MSTL lomuto_partition(
310 first, last, _MSTL median(*first, *(first + (last - first) / 2), *(last - 1), comp), comp);
311 _MSTL introspective_sort(cut, last, depth_limit, comp);
312 last = cut;
313 }
314}
315
323template <typename Iterator>
324void introspective_sort(Iterator first, Iterator last, int depth_limit) {
325 return _MSTL introspective_sort(first, last, depth_limit, _MSTL less<iter_value_t<Iterator>>());
326}
327
343template <typename Iterator, typename Compare, enable_if_t<
345void quick_sort(Iterator first, Iterator last, Compare comp) {
346 if (first < last) {
347 Iterator pov = last - 1;
348 Iterator cut = _MSTL lomuto_partition(first, last, *pov, comp);
349 _MSTL iter_swap(cut, pov);
350 _MSTL quick_sort(first, cut, comp);
351 _MSTL quick_sort(cut + 1, last, comp);
352 }
353}
354
361template <typename Iterator>
362void quick_sort(Iterator first, Iterator last) {
363 return _MSTL quick_sort(first, last, _MSTL less<iter_value_t<Iterator>>());
364}
365
368
380template <typename Iterator, typename Compare>
381void __intro_sort_dispatch(Iterator first, Iterator last, int depth_limit, Compare comp) {
382 while (last - first > MEMORY_ALIGN_THRESHHOLD) {
383 if (depth_limit == 0) {
384 _MSTL partial_sort(first, last, last, comp);
385 return;
386 }
387 --depth_limit;
388 Iterator cut = _MSTL lomuto_partition(
389 first, last, _MSTL median(*first, *(first + (last - first) / 2), *(last - 1), comp), comp);
390 _INNER __intro_sort_dispatch(cut, last, depth_limit, comp);
391 last = cut;
392 }
393}
394
402MSTL_CONST_FUNCTION constexpr int __log2_int(int x) noexcept {
403 int k = 0;
404 for (; x > 1; x >>= 1) ++k;
405 return k;
406}
407
410
424template <typename Iterator, typename Compare, enable_if_t<
426void sort(Iterator first, Iterator last, Compare comp) {
427 if (first == last) return;
428 _INNER __intro_sort_dispatch(first, last, _INNER __log2_int(last - first) * 2, comp);
429 if (last - first > MEMORY_ALIGN_THRESHHOLD) {
430 _MSTL insertion_sort(first, first + MEMORY_ALIGN_THRESHHOLD, comp);
431 for (Iterator i = first + MEMORY_ALIGN_THRESHHOLD; i != last; ++i) {
432 _INNER __insertion_sort_aux(i, *i, comp);
433 }
434 }
435 else {
436 _MSTL insertion_sort(first, last, comp);
437 }
438}
439
446template <typename Iterator>
447void sort(Iterator first, Iterator last) {
448 return _MSTL sort(first, last, _MSTL less<iter_value_t<Iterator>>());
449}
450
464template <typename Iterator, typename Compare, enable_if_t<
466void nth_element(Iterator first, Iterator nth, Iterator last, Compare comp) {
467 while (last - first > 3) {
468 Iterator cut = _MSTL lomuto_partition(
469 first, last, _MSTL median(*first, *(first + (last - first) / 2), *(last - 1), comp), comp);
470 if (cut <= nth) first = cut;
471 else last = cut;
472 }
473 _MSTL insertion_sort(first, last, comp);
474}
475
483template <typename Iterator>
484void nth_element(Iterator first, Iterator nth, Iterator last) {
485 return _MSTL nth_element(first, nth, last, _MSTL less<iter_value_t<Iterator>>());
486}
487 // SortAlgorithms
489
491#endif // MSTL_CORE_ALGORITHM_SORT_HPP__
MSTL比较算法
constexpr const T & median(const T &a, const T &b, const T &c, Compare comp) noexcept(noexcept(comp(a, b)))
返回三个值的中位数
MSTL_CONSTEXPR20 void adjust_heap(Iterator first, Distance hole_index, Distance len, T value, Compare comp)
堆调整辅助函数
MSTL_CONSTEXPR20 void make_heap(Iterator first, Iterator last, Compare comp)
创建堆
MSTL_CONSTEXPR20 void sort_heap(Iterator first, Iterator last, Compare comp)
将堆转换为有序序列
MSTL_INLINE17 constexpr bool is_ranges_rnd_iter_v
检查是否为范围随机访问迭代器
MSTL_INLINE17 constexpr bool is_ranges_input_iter_v
检查是否为范围输入迭代器
constexpr Iterator next(Iterator iter, iter_difference_t< Iterator > n=1)
获取迭代器的后一个位置
constexpr iter_difference_t< Iterator > distance(Iterator first, Iterator last)
计算两个迭代器之间的距离
typename iterator_traits< Iterator >::value_type iter_value_t
获取迭代器的值类型
typename iterator_traits< Iterator >::difference_type iter_difference_t
获取迭代器的差值类型
constexpr void inplace_merge(Iterator first, Iterator middle, Iterator last, Compare comp)
原地合并两个已排序的连续范围
#define _MSTL
全局命名空间MSTL前缀
#define MSTL_END_INNER__
结束inner命名空间
#define _INNER
inner命名空间前缀
#define MSTL_END_NAMESPACE__
结束全局命名空间MSTL
#define MSTL_BEGIN_NAMESPACE__
开始全局命名空间MSTL
#define MSTL_BEGIN_INNER__
开始inner命名空间
constexpr Iterator lomuto_partition(Iterator first, Iterator last, const T &pivot, Compare comp)
Lomuto分区算法
constexpr void iter_swap(Iterator1 a, Iterator2 b) noexcept(noexcept(_MSTL swap(*a, *b)))
交换迭代器指向的元素
constexpr Iterator2 copy_backward(Iterator1 first, Iterator1 last, Iterator2 result)
反向复制范围元素
void introspective_sort(Iterator first, Iterator last, int depth_limit, Compare comp)
内省排序
void insertion_sort(Iterator first, Iterator last, Compare comp)
插入排序
void merge_sort(Iterator first, Iterator last, Compare comp)
归并排序
void nth_element(Iterator first, Iterator nth, Iterator last, Compare comp)
第n个元素选择
bool is_sorted(Iterator first, Iterator last, Compare comp)
检查范围是否已排序
void quick_sort(Iterator first, Iterator last, Compare comp)
快速排序
Iterator2 partial_sort_copy(Iterator1 first, Iterator1 last, Iterator2 result_first, Iterator2 result_last, Compare comp)
部分排序并复制到另一个范围
Iterator is_sorted_until(Iterator first, Iterator last, Compare comp)
查找首个破坏排序的元素
void partial_sort(Iterator first, Iterator middle, Iterator last, Compare comp)
部分排序
void sort(Iterator first, Iterator last, Compare comp)
标准排序
typename enable_if< Test, T >::type enable_if_t
enable_if的便捷别名
MSTL堆算法
MSTL合并算法
MSTL分区算法
小于比较仿函数