⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 _algo.c

📁 MONA是为数不多的C++语言编写的一个很小的操作系统
💻 C
📖 第 1 页 / 共 4 页
字号:
        __first + __step_size, __last,        __result,        __comp);}const int __stl_chunk_size = 7;        template <class _RandomAccessIter, class _Distance, class _Compare>void __chunk_insertion_sort(_RandomAccessIter __first,                             _RandomAccessIter __last,                            _Distance __chunk_size, _Compare __comp){  while (__last - __first >= __chunk_size) {    __insertion_sort(__first, __first + __chunk_size, __comp);    __first += __chunk_size;  }  __insertion_sort(__first, __last, __comp);}template <class _RandomAccessIter, class _Pointer, class _Distance,          class _Compare>void __merge_sort_with_buffer(_RandomAccessIter __first,                               _RandomAccessIter __last, _Pointer __buffer,                              _Distance*, _Compare __comp) {  _Distance __len = __last - __first;  _Pointer __buffer_last = __buffer + __len;  _Distance __step_size = __stl_chunk_size;  __chunk_insertion_sort(__first, __last, __step_size, __comp);  while (__step_size < __len) {    __merge_sort_loop(__first, __last, __buffer, __step_size, __comp);    __step_size *= 2;    __merge_sort_loop(__buffer, __buffer_last, __first, __step_size, __comp);    __step_size *= 2;  }}template <class _BidirectionalIter1, class _BidirectionalIter2,          class _Distance>_BidirectionalIter1 __rotate_adaptive(_BidirectionalIter1 __first,                                      _BidirectionalIter1 __middle,                                      _BidirectionalIter1 __last,                                      _Distance __len1, _Distance __len2,                                      _BidirectionalIter2 __buffer,                                      _Distance __buffer_size) {  if (__len1 > __len2 && __len2 <= __buffer_size) {    _BidirectionalIter2 __buffer_end = copy(__middle, __last, __buffer);    copy_backward(__first, __middle, __last);    return copy(__buffer, __buffer_end, __first);  }  else if (__len1 <= __buffer_size) {    _BidirectionalIter2 __buffer_end = copy(__first, __middle, __buffer);    copy(__middle, __last, __first);    return copy_backward(__buffer, __buffer_end, __last);  }  else    return rotate(__first, __middle, __last);}template <class _BidirectionalIter, class _Distance, class _Pointer,          class _Compare>void __merge_adaptive(_BidirectionalIter __first,                       _BidirectionalIter __middle,                       _BidirectionalIter __last,                      _Distance __len1, _Distance __len2,                      _Pointer __buffer, _Distance __buffer_size,                      _Compare __comp) {  if (__len1 <= __len2 && __len1 <= __buffer_size) {    _Pointer __buffer_end = copy(__first, __middle, __buffer);    merge(__buffer, __buffer_end, __middle, __last, __first, __comp);  }  else if (__len2 <= __buffer_size) {    _Pointer __buffer_end = copy(__middle, __last, __buffer);    __merge_backward(__first, __middle, __buffer, __buffer_end, __last,                     __comp);  }  else {    _BidirectionalIter __first_cut = __first;    _BidirectionalIter __second_cut = __middle;    _Distance __len11 = 0;    _Distance __len22 = 0;    if (__len1 > __len2) {      __len11 = __len1 / 2;      advance(__first_cut, __len11);      __second_cut = lower_bound(__middle, __last, *__first_cut, __comp);      __len22 += distance(__middle, __second_cut);       }    else {      __len22 = __len2 / 2;      advance(__second_cut, __len22);      __first_cut = upper_bound(__first, __middle, *__second_cut, __comp);      __len11 += distance(__first, __first_cut);    }    _BidirectionalIter __new_middle =      __rotate_adaptive(__first_cut, __middle, __second_cut, __len1 - __len11,                        __len22, __buffer, __buffer_size);    __merge_adaptive(__first, __first_cut, __new_middle, __len11,                     __len22, __buffer, __buffer_size, __comp);    __merge_adaptive(__new_middle, __second_cut, __last, __len1 - __len11,                     __len2 - __len22, __buffer, __buffer_size, __comp);  }}template <class _RandomAccessIter, class _Pointer, class _Distance,           class _Compare>void __stable_sort_adaptive(_RandomAccessIter __first,                             _RandomAccessIter __last, _Pointer __buffer,                            _Distance __buffer_size, _Compare __comp) {  _Distance __len = (__last - __first + 1) / 2;  _RandomAccessIter __middle = __first + __len;  if (__len > __buffer_size) {    __stable_sort_adaptive(__first, __middle, __buffer, __buffer_size,                            __comp);    __stable_sort_adaptive(__middle, __last, __buffer, __buffer_size,                            __comp);  }  else {    __merge_sort_with_buffer(__first, __middle, __buffer, (_Distance*)0,                               __comp);    __merge_sort_with_buffer(__middle, __last, __buffer, (_Distance*)0,                               __comp);  }  __merge_adaptive(__first, __middle, __last, _Distance(__middle - __first),                    _Distance(__last - __middle), __buffer, __buffer_size,                   __comp);}template <class _RandomAccessIter, class _Tp, class _Distance, class _Compare>void __stable_sort_aux(_RandomAccessIter __first,			      _RandomAccessIter __last, _Tp*, _Distance*,			      _Compare __comp) {  _Temporary_buffer<_RandomAccessIter, _Tp> buf(__first, __last);  if (buf.begin() == 0)    __inplace_stable_sort(__first, __last, __comp);  else     __stable_sort_adaptive(__first, __last, buf.begin(),                           _Distance(buf.size()),                           __comp);}template <class _RandomAccessIter>void stable_sort(_RandomAccessIter __first,		 _RandomAccessIter __last) {  _STLP_DEBUG_CHECK(__check_range(__first, __last))  __stable_sort_aux(__first, __last,                    _STLP_VALUE_TYPE(__first, _RandomAccessIter),                    _STLP_DISTANCE_TYPE(__first, _RandomAccessIter),                    __less(_STLP_VALUE_TYPE(__first, _RandomAccessIter)));}template <class _RandomAccessIter, class _Compare>void stable_sort(_RandomAccessIter __first,		 _RandomAccessIter __last, _Compare __comp) {  _STLP_DEBUG_CHECK(__check_range(__first, __last))  __stable_sort_aux(__first, __last,                    _STLP_VALUE_TYPE(__first, _RandomAccessIter),                    _STLP_DISTANCE_TYPE(__first, _RandomAccessIter),                     __comp);}// partial_sort, partial_sort_copy, and auxiliary functions.template <class _RandomAccessIter, class _Tp, class _Compare>void __partial_sort(_RandomAccessIter __first, _RandomAccessIter __middle,                    _RandomAccessIter __last, _Tp*, _Compare __comp) {  make_heap(__first, __middle, __comp);  for (_RandomAccessIter __i = __middle; __i < __last; ++__i)    if (__comp(*__i, *__first))      __pop_heap(__first, __middle, __i, _Tp(*__i), __comp,                 _STLP_DISTANCE_TYPE(__first, _RandomAccessIter));  sort_heap(__first, __middle, __comp);}template <class _RandomAccessIter>void partial_sort(_RandomAccessIter __first,_RandomAccessIter __middle, _RandomAccessIter __last) {  _STLP_DEBUG_CHECK(__check_range(__first, __middle))  _STLP_DEBUG_CHECK(__check_range(__middle, __last))  __partial_sort(__first, __middle, __last, _STLP_VALUE_TYPE(__first, _RandomAccessIter),                  __less(_STLP_VALUE_TYPE(__first, _RandomAccessIter)));}template <class _RandomAccessIter, class _Compare>void partial_sort(_RandomAccessIter __first,_RandomAccessIter __middle,                  _RandomAccessIter __last, _Compare __comp) {  _STLP_DEBUG_CHECK(__check_range(__first, __middle))  _STLP_DEBUG_CHECK(__check_range(__middle, __last))  __partial_sort(__first, __middle, __last, _STLP_VALUE_TYPE(__first, _RandomAccessIter), __comp);}template <class _InputIter, class _RandomAccessIter, class _Compare,          class _Distance, class _Tp>_RandomAccessIter __partial_sort_copy(_InputIter __first,                                         _InputIter __last,                                         _RandomAccessIter __result_first,                                         _RandomAccessIter __result_last,                                         _Compare __comp, _Distance*, _Tp*) {  if (__result_first == __result_last) return __result_last;  _RandomAccessIter __result_real_last = __result_first;  while(__first != __last && __result_real_last != __result_last) {    *__result_real_last = *__first;    ++__result_real_last;    ++__first;  }  make_heap(__result_first, __result_real_last, __comp);  while (__first != __last) {    if (__comp(*__first, *__result_first))      __adjust_heap(__result_first, _Distance(0),                    _Distance(__result_real_last - __result_first),                    _Tp(*__first),                    __comp);    ++__first;  }  sort_heap(__result_first, __result_real_last, __comp);  return __result_real_last;}template <class _InputIter, class _RandomAccessIter>_RandomAccessIterpartial_sort_copy(_InputIter __first, _InputIter __last,                  _RandomAccessIter __result_first, _RandomAccessIter __result_last) {  _STLP_DEBUG_CHECK(__check_range(__first, __last))  _STLP_DEBUG_CHECK(__check_range(__result_first, __result_last))  return __partial_sort_copy(__first, __last, __result_first, __result_last,                              __less(_STLP_VALUE_TYPE(__first, _InputIter)),                             _STLP_DISTANCE_TYPE(__result_first, _RandomAccessIter),                             _STLP_VALUE_TYPE(__first, _InputIter));}template <class _InputIter, class _RandomAccessIter, class _Compare>_RandomAccessIterpartial_sort_copy(_InputIter __first, _InputIter __last,                  _RandomAccessIter __result_first,                  _RandomAccessIter __result_last, _Compare __comp) {  _STLP_DEBUG_CHECK(__check_range(__first, __last))  _STLP_DEBUG_CHECK(__check_range(__result_first, __result_last))  return __partial_sort_copy(__first, __last, __result_first, __result_last,                             __comp,                             _STLP_DISTANCE_TYPE(__result_first, _RandomAccessIter),                             _STLP_VALUE_TYPE(__first, _InputIter));}// nth_element() and its auxiliary functions.  template <class _RandomAccessIter, class _Tp, class _Compare>void __nth_element(_RandomAccessIter __first, _RandomAccessIter __nth,                   _RandomAccessIter __last, _Tp*, _Compare __comp) {  while (__last - __first > 3) {    _RandomAccessIter __cut =      __unguarded_partition(__first, __last,                            _Tp(__median(*__first,                                         *(__first + (__last - __first)/2),                                          *(__last - 1),                                         __comp)),                            __comp);    if (__cut <= __nth)      __first = __cut;    else       __last = __cut;  }  __insertion_sort(__first, __last, __comp);}template <class _RandomAccessIter>void nth_element(_RandomAccessIter __first, _RandomAccessIter __nth,                 _RandomAccessIter __last) {  _STLP_DEBUG_CHECK(__check_range(__first, __nth))  _STLP_DEBUG_CHECK(__check_range(__nth, __last))  __nth_element(__first, __nth, __last, _STLP_VALUE_TYPE(__first, _RandomAccessIter),                 __less(_STLP_VALUE_TYPE(__first, _RandomAccessIter)));}template <class _RandomAccessIter, class _Compare>void nth_element(_RandomAccessIter __first, _RandomAccessIter __nth,                 _RandomAccessIter __last, _Compare __comp) {  _STLP_DEBUG_CHECK(__check_range(__first, __nth))  _STLP_DEBUG_CHECK(__check_range(__nth, __last))  __nth_element(__first, __nth, __last, _STLP_VALUE_TYPE(__first, _RandomAccessIter), __comp);}// Binary search (lower_bound, upper_bound, equal_range, binary_search).template <class _ForwardIter, class _Tp, class _Compare, class _Distance>_ForwardIter __upper_bound(_ForwardIter __first, _ForwardIter __last,                           const _Tp& __val, _Compare __comp, _Distance*){  _Distance __len = distance(__first, __last);  _Distance __half;  while (__len > 0) {    __half = __len >> 1;    _ForwardIter __middle = __first;    advance(__middle, __half);    if (__comp(__val, *__middle))      __len = __half;    else {      __first = __middle;      ++__first;      __len = __len - __half - 1;    }  }  return __first;}template <class _ForwardIter, class _Tp, class _Compare, class _Distance>pair<_ForwardIter, _ForwardIter>__equal_range(_ForwardIter __first, _ForwardIter __last, const _Tp& __val,              _Compare __comp, _Distance*){  _Distance __len = distance(__first, __last);  _Distance __half;  while (__len > 0) {    __half = __len >> 1;    _ForwardIter __middle = __first;    advance(__middle, __half);    if (__comp(*__middle, __val)) {      __first = __middle;      ++__first;      __len = __len - __half - 1;    }    else if (__comp(__val, *__middle))      __len = __half;    else {      _ForwardIter __left = lower_bound(__first, __middle, __val, __comp);      advance(__first, __len);      _ForwardIter __right = upper_bound(++__middle, __first, __val, __comp);      return pair<_ForwardIter, _ForwardIter>(__left, __right);    }  }  return pair<_ForwardIter, _ForwardIter>(__first, __first);}           template <class _InputIter1, class _InputIter2, class _OutputIter>_OutputIter merge(_InputIter1 __first1, _InputIter1 __last1,                  _InputIter2 __first2, _InputIter2 __last2,                  _OutputIter __result) {  _STLP_DEBUG_CHECK(__check_range(__first1, __last1))  _STLP_DEBUG_CHECK(__check_range(__first2, __last2))  while (__first1 != __last1 && __first2 != __last2) {    if (*__first2 < *__first1) {      *__result = *__first2;      ++__first2;    }    else {      *__result = *__first1;      ++__first1;    }    ++__result;  }  return copy(__first2, __last2, copy(__first1, __last1, __result));}template <class _InputIter1, class _InputIter2, class _OutputIter,          class _Compare>_OutputIter merge(_InputIter1 __first1, _InputIter1 __last1,                  _InputIter2 __first2, _InputIter2 __last2,                  _OutputIter __result, _Compare __comp) {  _STLP_DEBUG_CHECK(__check_range(__first1, __last1))  _STLP_DEBUG_CHECK(__check_range(__first2, __last2))  while (__first1 != __last1 && __first2 != __last2) {    if (__comp(*__first2, *__first1)) {      *__result = *__first2;      ++__first2;    }    else {      *__result = *__first1;      ++__first1;    }    ++__result;  }  return copy(__first2, __last2, copy(__first1, __last1, __result));}template <class _BidirectionalIter, class _Distance, class _Compare>void __merge_without_buffer(_BidirectionalIter __first,                            _BidirectionalIter __middle,                            _BidirectionalIter __last,                            _Distance __len1, _Distance __len2,                            _Compare __comp) {  if (__len1 == 0 || __len2 == 0)    return;  if (__len1 + __len2 == 2) {    if (__comp(*__middle, *__first))      iter_swap(__first, __middle);    return;  }  _BidirectionalIter __first_cut = __first;  _BidirectionalIter __second_cut = __middle;  _Distance __len11 = 0;  _Distance __len22 = 0;  if (__len1 > __len2) {    __len11 = __len1 / 2;    advance(__first_cut, __len11);    __second_cut = lower_bound(__middle, __last, *__first_cut, __comp);    __len22 += distance(__middle, __second_cut);  }  else {    __len22 = __len2 / 2;    advance(__second_cut, __len22);    __first_cut = upper_bound(__first, __middle, *__second_cut, __comp);    __len11 +=distance(__first, __first_cut);  }  _BidirectionalIter __new_middle    = rotate(__first_cut, __middle, __second_cut);  __merge_without_buffer(__first, __first_cut, __new_middle, __len11, __len22,                         __comp);  __merge_without_buffer(__new_middle, __second_cut, __last, __len1 - __len11,                         __len2 - __len22, __comp);}template <class _BidirectionalIter1, class _BidirectionalIter2,          class _BidirectionalIter3, class _Compare>_BidirectionalIter3 __merge_backward(_BidirectionalIter1 __first1,                                     _BidirectionalIter1 __last1,                                     _BidirectionalIter2 __first2,                                     _BidirectionalIter2 __last2,                                     _BidirectionalIter3 __result,                                     _Compare __comp) {  if (__first1 == __last1)    return copy_backward(__first2, __last2, __result);  if (__first2 == __last2)    return copy_backward(__first1, __last1, __result);  --__last1;  --__last2;  while (true) {    if (__comp(*__last2, *__last1)) {      *--__result = *__last1;      if (__first1 == __last1)        return copy_backward(__first2, ++__last2, __result);      --__last1;    }    else {      *--__result = *__last2;      if (__first2 == __last2)        return copy_backward(__first1, ++__last1, __result);      --__last2;    }  }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -