NexusForce 1.0.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
sort.hpp
浏览该文件的文档.
1#ifndef NEFORCE_CORE_ALGORITHM_SORT_HPP__
2#define NEFORCE_CORE_ALGORITHM_SORT_HPP__
3
11
16NEFORCE_BEGIN_NAMESPACE__
17
23
143
155template <typename Iterator, typename Compare>
156bool is_sorted(Iterator first, Iterator last, Compare comp) {
157 static_assert(is_ranges_input_iter_v<Iterator>, "Iterator must be input_iterator");
158 static_assert(is_invocable_v<Compare, decltype(*first), decltype(*first)>, "Compare must be invocable");
159
160 if (first == last) {
161 return true;
162 }
163 Iterator next = _NEFORCE next(first);
164 for (; next != last; ++first, ++next) {
165 if (comp(*next, *first)) {
166 return false;
167 }
168 }
169 return true;
170}
171
179template <typename Iterator>
180bool is_sorted(Iterator first, Iterator last) {
181 return is_sorted(first, last, _NEFORCE less<iter_value_t<Iterator>>());
182}
183
195template <typename Iterator, typename Compare>
196Iterator is_sorted_until(Iterator first, Iterator last, Compare comp) {
197 static_assert(is_ranges_input_iter_v<Iterator>, "Iterator must be input_iterator");
198 static_assert(is_invocable_v<Compare, decltype(*first), decltype(*first)>, "Compare must be invocable");
199
200 if (first == last) {
201 return last;
202 }
203 Iterator next = _NEFORCE next(first);
204 for (; next != last; ++first, ++next) {
205 if (comp(*next, *first)) {
206 return next;
207 }
208 }
209 return last;
210}
211
219template <typename Iterator>
220Iterator is_sorted_until(Iterator first, Iterator last) {
221 return is_sorted_until(first, last, _NEFORCE less<iter_value_t<Iterator>>());
222}
223
224
242template <typename Iterator, typename Compare>
243void merge_sort(Iterator first, Iterator last, Compare comp) {
244 static_assert(is_ranges_rnd_iter_v<Iterator>, "Iterator must be random_access_iterator");
245
246 const auto n = _NEFORCE distance(first, last);
247 if (n < 2) {
248 return;
249 }
250 Iterator mid = first + n / 2;
251 _NEFORCE merge_sort(first, mid);
252 _NEFORCE merge_sort(mid, last);
253 _NEFORCE inplace_merge(first, mid, last, comp);
254}
255
262template <typename Iterator>
263void merge_sort(Iterator first, Iterator last) {
264 return _NEFORCE merge_sort(first, last, _NEFORCE less<iter_value_t<Iterator>>());
265}
266
282template <typename Iterator, typename Compare>
283void partial_sort(Iterator first, Iterator middle, Iterator last, Compare comp) {
284 if (first == middle) {
285 return;
286 }
287 _NEFORCE make_heap(first, middle, comp);
288 for (Iterator i = middle; i < last; ++i) {
289 if (comp(*i, *first)) {
290 inner::pop_heap_aux(first, middle, i, *i, comp);
291 }
292 }
293 _NEFORCE sort_heap(first, middle, comp);
294}
295
303template <typename Iterator>
304void partial_sort(Iterator first, Iterator middle, Iterator last) {
305 return _NEFORCE partial_sort(first, middle, last, _NEFORCE less<iter_value_t<Iterator>>());
306}
307
324template <typename Iterator1, typename Iterator2, typename Compare>
325Iterator2 partial_sort_copy(Iterator1 first, Iterator1 last, Iterator2 result_first, Iterator2 result_last,
326 Compare comp) {
327 static_assert(is_ranges_input_iter_v<Iterator1>, "Iterator must be input_iterator");
328
329 if (result_first == result_last) {
330 return result_last;
331 }
332 Iterator2 result_real_last = result_first;
333 while (first != last && result_real_last != result_last) {
334 *result_real_last = *first;
335 ++result_real_last;
336 ++first;
337 }
338 _NEFORCE make_heap(result_first, result_real_last, comp);
339 while (first != last) {
340 if (comp(*first, *result_first)) {
341 _NEFORCE adjust_heap(result_first, 0, result_real_last - result_first, *first, comp);
342 }
343 ++first;
344 }
345 _NEFORCE sort_heap(result_first, result_real_last, comp);
346 return result_real_last;
347}
348
359template <typename Iterator1, typename Iterator2>
360Iterator2 partial_sort_copy(Iterator1 first, Iterator1 last, Iterator2 result_first, Iterator2 result_last) {
361 return _NEFORCE partial_sort_copy(first, result_first, result_last, _NEFORCE less<iter_value_t<Iterator1>>());
362}
363
365NEFORCE_BEGIN_INNER__
366
378template <typename Iterator, typename T, typename Compare>
379void __insertion_sort_aux(Iterator last, T value, Compare comp) {
380 Iterator next = last;
381 --next;
382 while (comp(value, *next)) {
383 *last = *next;
384 last = next;
385 --next;
386 }
387 *last = value;
388}
389
390NEFORCE_END_INNER__
392
408template <typename Iterator, typename Compare>
409void insertion_sort(Iterator first, Iterator last, Compare comp) {
410 static_assert(is_ranges_rnd_iter_v<Iterator>, "Iterator must be random_access_iterator");
411 static_assert(is_invocable_v<Compare, decltype(*first), decltype(*first)>, "Compare must be invocable");
412
413 if (first == last) {
414 return;
415 }
416 for (Iterator i = first + 1; i != last; ++i) {
417 iter_value_t<Iterator> value = *i;
418 if (comp(value, *first)) {
419 _NEFORCE copy_backward(first, i, i + 1);
420 *first = value;
421 } else {
422 inner::__insertion_sort_aux(i, value, comp);
423 }
424 }
425}
426
433template <typename Iterator>
434void insertion_sort(Iterator first, Iterator last) {
435 return _NEFORCE insertion_sort(first, last, _NEFORCE less<iter_value_t<Iterator>>());
436}
437
456template <typename Iterator, typename Compare>
457void introspective_sort(Iterator first, Iterator last, int depth_limit, Compare comp) {
458 static_assert(is_invocable_v<Compare, decltype(*first), decltype(*first)>, "Compare must be invocable");
459
460 while (first < last) {
461 if (depth_limit == 0) {
462 _NEFORCE partial_sort(first, last, last, comp);
463 return;
464 }
465 --depth_limit;
466 Iterator cut = _NEFORCE lomuto_partition(
467 first, last, _NEFORCE median(*first, *(first + (last - first) / 2), *(last - 1), comp), comp);
468 _NEFORCE introspective_sort(cut, last, depth_limit, comp);
469 last = cut;
470 }
471}
472
480template <typename Iterator>
481void introspective_sort(Iterator first, Iterator last, int depth_limit) {
482 return _NEFORCE introspective_sort(first, last, depth_limit, _NEFORCE less<iter_value_t<Iterator>>());
483}
484
504template <typename Iterator, typename Compare>
505void quick_sort(Iterator first, Iterator last, Compare comp) {
506 if (first < last) {
507 Iterator pov = last - 1;
508 Iterator cut = _NEFORCE lomuto_partition(first, last, *pov, comp);
509 _NEFORCE iter_swap(cut, pov);
510 _NEFORCE quick_sort(first, cut, comp);
511 _NEFORCE quick_sort(cut + 1, last, comp);
512 }
513}
514
521template <typename Iterator>
522void quick_sort(Iterator first, Iterator last) {
523 return _NEFORCE quick_sort(first, last, _NEFORCE less<iter_value_t<Iterator>>());
524}
525
527NEFORCE_BEGIN_INNER__
528
540template <typename Iterator, typename Compare>
541void __intro_sort_dispatch(Iterator first, Iterator last, int depth_limit, Compare comp) {
542 while (last - first > MEMORY_ALIGN_THRESHHOLD) {
543 if (depth_limit == 0) {
544 _NEFORCE partial_sort(first, last, last, comp);
545 return;
546 }
547 --depth_limit;
548 Iterator cut = _NEFORCE lomuto_partition(
549 first, last, _NEFORCE median(*first, *(first + (last - first) / 2), *(last - 1), comp), comp);
550 inner::__intro_sort_dispatch(cut, last, depth_limit, comp);
551 last = cut;
552 }
553}
554
562NEFORCE_CONST_FUNCTION constexpr int __log2_int(int x) noexcept {
563 int k = 0;
564 for (; x > 1; x >>= 1) {
565 ++k;
566 }
567 return k;
568}
569
570NEFORCE_END_INNER__
572
590template <typename Iterator, typename Compare>
591void sort(Iterator first, Iterator last, Compare comp) {
592 if (first == last) {
593 return;
594 }
595
596 inner::__intro_sort_dispatch(first, last, inner::__log2_int(last - first) * 2, comp);
597 constexpr size_t threshhold = MEMORY_ALIGN_THRESHHOLD;
598
599 if (last - first > threshhold) {
600 _NEFORCE insertion_sort(first, first + threshhold, comp);
601 for (Iterator i = first + threshhold; i != last; ++i) {
602 inner::__insertion_sort_aux(i, *i, comp);
603 }
604 } else {
605 _NEFORCE insertion_sort(first, last, comp);
606 }
607}
608
615template <typename Iterator>
616void sort(Iterator first, Iterator last) {
617 return _NEFORCE sort(first, last, _NEFORCE less<iter_value_t<Iterator>>());
618}
619
633template <typename Iterator, typename Compare>
634void nth_element(Iterator first, Iterator nth, Iterator last, Compare comp) {
635 while (last - first > 3) {
636 Iterator cut = _NEFORCE lomuto_partition(
637 first, last, _NEFORCE median(*first, *(first + (last - first) / 2), *(last - 1), comp), comp);
638 if (cut <= nth) {
639 first = cut;
640 } else {
641 last = cut;
642 }
643 }
644 _NEFORCE insertion_sort(first, last, comp);
645}
646
654template <typename Iterator>
655void nth_element(Iterator first, Iterator nth, Iterator last) {
656 return _NEFORCE nth_element(first, nth, last, _NEFORCE less<iter_value_t<Iterator>>());
657}
658 // SortAlgorithms
660 // StandardAlgorithms
662
663NEFORCE_END_NAMESPACE__
664#endif // NEFORCE_CORE_ALGORITHM_SORT_HPP__
比较算法
constexpr const T & median(const T &a, const T &b, const T &c, Compare comp) noexcept(noexcept(comp(a, b)))
返回三个值的中位数
NEFORCE_CONSTEXPR20 void adjust_heap(Iterator first, iter_difference_t< Iterator > hole_index, iter_difference_t< Iterator > len, T value, Compare comp)
堆调整辅助函数
NEFORCE_CONSTEXPR20 void sort_heap(Iterator first, Iterator last, Compare comp)
将堆转换为有序序列
NEFORCE_CONSTEXPR20 void make_heap(Iterator first, Iterator last, Compare comp)
创建堆
NEFORCE_INLINE17 constexpr bool is_invocable_v
is_invocable的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_ranges_input_iter_v
检查是否为范围输入迭代器
NEFORCE_INLINE17 constexpr bool is_ranges_rnd_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
获取迭代器的值类型
NEFORCE_CONSTEXPR20 void inplace_merge(Iterator first, Iterator middle, Iterator last, Compare comp)
原地合并两个已排序的连续范围
constexpr Iterator lomuto_partition(Iterator first, Iterator last, const T &pivot, Compare comp)
Lomuto分区算法
constexpr Iterator2 copy_backward(Iterator1 first, Iterator1 last, Iterator2 result) noexcept(noexcept(inner::__copy_backward_aux(first, last, result)))
反向复制范围元素
constexpr void iter_swap(Iterator1 a, Iterator2 b) noexcept(noexcept(_NEFORCE swap(*a, *b)))
交换迭代器指向的元素
bool is_sorted(Iterator first, Iterator last, Compare comp)
检查范围是否已排序
void introspective_sort(Iterator first, Iterator last, int depth_limit, Compare comp)
内省排序
void sort(Iterator first, Iterator last, Compare comp)
标准排序
Iterator is_sorted_until(Iterator first, Iterator last, Compare comp)
查找首个破坏排序的元素
Iterator2 partial_sort_copy(Iterator1 first, Iterator1 last, Iterator2 result_first, Iterator2 result_last, Compare comp)
部分排序并复制到另一个范围
void quick_sort(Iterator first, Iterator last, Compare comp)
快速排序
void partial_sort(Iterator first, Iterator middle, Iterator last, Compare comp)
部分排序
void nth_element(Iterator first, Iterator nth, Iterator last, Compare comp)
第n个元素选择
void merge_sort(Iterator first, Iterator last, Compare comp)
归并排序
void insertion_sort(Iterator first, Iterator last, Compare comp)
插入排序
堆算法
合并算法
分区算法
小于比较仿函数