1#ifndef MSTL_CORE_ALGORITHM_SORT_HPP__
2#define MSTL_CORE_ALGORITHM_SORT_HPP__
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;
39 for (;
next != last; ++first, ++
next) {
40 if (comp(*
next, *first)) {
54template <
typename Iterator>
70template <
typename Iterator,
typename Compare, enable_if_t<is_ranges_input_iter_v<Iterator>,
int> = 0>
72 if (first == last)
return last;
74 for (;
next != last; ++first, ++
next) {
75 if (comp(*
next, *first))
88template <
typename Iterator>
107template <
typename Iterator,
typename Compare,
enable_if_t<
109void merge_sort(Iterator first, Iterator last, Compare comp) {
112 Iterator mid = first + n / 2;
124template <
typename Iterator>
142template <
typename Iterator,
typename Compare,
enable_if_t<
144void partial_sort(Iterator first, Iterator middle, Iterator last, Compare comp) {
145 if (first == middle)
return;
147 for (Iterator i = middle; i < last; ++i) {
148 if (comp(*i, *first)) {
149 _INNER pop_heap_aux(first, middle, i, *i, comp);
162template <
typename Iterator>
181template <
typename Iterator1,
typename Iterator2,
typename Compare,
enable_if_t<
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;
193 while (first != last) {
194 if (comp(*first, *result_first)) {
196 Distance(result_real_last - result_first), *first, comp);
201 return result_real_last;
214template <
typename Iterator1,
typename Iterator2>
215Iterator2
partial_sort_copy(Iterator1 first, Iterator1 last, Iterator2 result_first, Iterator2 result_last) {
233template <
typename Iterator,
typename T,
typename Compare>
234void __insertion_sort_aux(Iterator last, T value, Compare comp) {
235 Iterator
next = last;
237 while (comp(value, *
next)) {
260template <
typename Iterator,
typename Compare,
enable_if_t<
263 if (first == last)
return;
264 for (Iterator i = first + 1; i != last; ++i) {
266 if (comp(value, *first)) {
270 _INNER __insertion_sort_aux(i, value, comp);
281template <
typename Iterator>
300template <
typename Iterator,
typename Compare,
enable_if_t<
303 while (first < last) {
304 if (depth_limit == 0) {
310 first, last,
_MSTL median(*first, *(first + (last - first) / 2), *(last - 1), comp), comp);
323template <
typename Iterator>
343template <
typename Iterator,
typename Compare,
enable_if_t<
345void quick_sort(Iterator first, Iterator last, Compare comp) {
347 Iterator pov = last - 1;
361template <
typename Iterator>
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) {
389 first, last,
_MSTL median(*first, *(first + (last - first) / 2), *(last - 1), comp), comp);
390 _INNER __intro_sort_dispatch(cut, last, depth_limit, comp);
402MSTL_CONST_FUNCTION
constexpr int __log2_int(
int x)
noexcept {
404 for (; x > 1; x >>= 1) ++k;
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) {
431 for (Iterator i = first + MEMORY_ALIGN_THRESHHOLD; i != last; ++i) {
432 _INNER __insertion_sort_aux(i, *i, comp);
446template <
typename Iterator>
447void sort(Iterator first, Iterator last) {
464template <
typename Iterator,
typename Compare,
enable_if_t<
466void nth_element(Iterator first, Iterator nth, Iterator last, Compare comp) {
467 while (last - first > 3) {
469 first, last,
_MSTL median(*first, *(first + (last - first) / 2), *(last - 1), comp), comp);
470 if (cut <= nth) first = cut;
483template <
typename Iterator>
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的便捷别名