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

📄 _algo.c

📁 MONA是为数不多的C++语言编写的一个很小的操作系统
💻 C
📖 第 1 页 / 共 4 页
字号:
  _STLP_DEBUG_CHECK(__check_range(__first, __last))  if (__first == __last) return;  for (_RandomAccessIter __i = __first + 1; __i != __last; ++__i)    iter_swap(__i, __first + __random_number((__i - __first) + 1));}template <class _RandomAccessIter, class _RandomNumberGenerator>void random_shuffle(_RandomAccessIter __first, _RandomAccessIter __last,                    _RandomNumberGenerator& __rand) {  _STLP_DEBUG_CHECK(__check_range(__first, __last))  if (__first == __last) return;  for (_RandomAccessIter __i = __first + 1; __i != __last; ++__i)    iter_swap(__i, __first + __rand((__i - __first) + 1));}# ifndef _STLP_NO_EXTENSIONS// random_sample and random_sample_n (extensions, not part of the standard).template <class _ForwardIter, class _OutputIter, class _Distance>_OutputIter random_sample_n(_ForwardIter __first, _ForwardIter __last,                            _OutputIter __out, const _Distance __n){  _STLP_DEBUG_CHECK(__check_range(__first, __last))  _Distance __remaining = distance(__first, __last);  _Distance __m = (min) (__n, __remaining);  while (__m > 0) {    if (__random_number(__remaining) < __m) {      *__out = *__first;      ++__out;      --__m;    }    --__remaining;    ++__first;  }  return __out;}template <class _ForwardIter, class _OutputIter, class _Distance,          class _RandomNumberGenerator>_OutputIter random_sample_n(_ForwardIter __first, _ForwardIter __last,                            _OutputIter __out, const _Distance __n,                            _RandomNumberGenerator& __rand){  _STLP_DEBUG_CHECK(__check_range(__first, __last))  _Distance __remaining = distance(__first, __last);  _Distance __m = (min) (__n, __remaining);  while (__m > 0) {    if (__rand(__remaining) < __m) {      *__out = *__first;      ++__out;      --__m;    }    --__remaining;    ++__first;  }  return __out;}template <class _InputIter, class _RandomAccessIter, class _Distance>_RandomAccessIter __random_sample(_InputIter __first, _InputIter __last,                                  _RandomAccessIter __out,                                  const _Distance __n){  _Distance __m = 0;  _Distance __t = __n;  for ( ; __first != __last && __m < __n; ++__m, ++__first)     __out[__m] = *__first;  while (__first != __last) {    ++__t;    _Distance __M = __random_number(__t);    if (__M < __n)      __out[__M] = *__first;    ++__first;  }  return __out + __m;}template <class _InputIter, class _RandomAccessIter,          class _RandomNumberGenerator, class _Distance>_RandomAccessIter __random_sample(_InputIter __first, _InputIter __last,                                  _RandomAccessIter __out,                                  _RandomNumberGenerator& __rand,                                  const _Distance __n){  _Distance __m = 0;  _Distance __t = __n;  for ( ; __first != __last && __m < __n; ++__m, ++__first)    __out[__m] = *__first;  while (__first != __last) {    ++__t;    _Distance __M = __rand(__t);    if (__M < __n)      __out[__M] = *__first;    ++__first;  }  return __out + __m;}template <class _InputIter, class _RandomAccessIter>_RandomAccessIterrandom_sample(_InputIter __first, _InputIter __last,              _RandomAccessIter __out_first, _RandomAccessIter __out_last) {  _STLP_DEBUG_CHECK(__check_range(__first, __last))  _STLP_DEBUG_CHECK(__check_range(__out_first, __out_last))  return __random_sample(__first, __last,                         __out_first, __out_last - __out_first);}template <class _InputIter, class _RandomAccessIter, class _RandomNumberGenerator>_RandomAccessIterrandom_sample(_InputIter __first, _InputIter __last,              _RandomAccessIter __out_first, _RandomAccessIter __out_last,              _RandomNumberGenerator& __rand) {  _STLP_DEBUG_CHECK(__check_range(__first, __last))  _STLP_DEBUG_CHECK(__check_range(__out_first, __out_last))  return __random_sample(__first, __last,                         __out_first, __rand,                         __out_last - __out_first);}# endif /* _STLP_NO_EXTENSIONS */// partition, stable_partition, and their auxiliary functionstemplate <class _ForwardIter, class _Predicate>_STLP_INLINE_LOOP _ForwardIter __partition(_ForwardIter __first,                                           _ForwardIter __last,                                           _Predicate   __pred,                                           const forward_iterator_tag &) {  if (__first == __last) return __first;  while (__pred(*__first))    if (++__first == __last) return __first;  _ForwardIter __next = __first;  while (++__next != __last)    if (__pred(*__next)) {      swap(*__first, *__next);      ++__first;    }  return __first;}template <class _BidirectionalIter, class _Predicate>_STLP_INLINE_LOOP _BidirectionalIter __partition(_BidirectionalIter __first,                                                 _BidirectionalIter __last,                                                 _Predicate __pred,                                                 const bidirectional_iterator_tag &) {  while (true) {    while (true)      if (__first == __last)        return __first;      else if (__pred(*__first))        ++__first;      else        break;    --__last;    while (true)      if (__first == __last)        return __first;      else if (!__pred(*__last))        --__last;      else        break;    iter_swap(__first, __last);    ++__first;  }}# if defined (_STLP_NONTEMPL_BASE_MATCH_BUG)template <class _BidirectionalIter, class _Predicate>inline_BidirectionalIter __partition(_BidirectionalIter __first,                               _BidirectionalIter __last,			       _Predicate __pred,			       const random_access_iterator_tag &) {  return __partition(__first, __last, __pred, bidirectional_iterator_tag());}# endiftemplate <class _ForwardIter, class _Predicate>_ForwardIter partition(_ForwardIter __first, _ForwardIter __last, _Predicate   __pred) {  _STLP_DEBUG_CHECK(__check_range(__first, __last))  return __partition(__first, __last, __pred, _STLP_ITERATOR_CATEGORY(__first, _ForwardIter));}template <class _ForwardIter, class _Predicate, class _Distance>_ForwardIter __inplace_stable_partition(_ForwardIter __first,                                        _ForwardIter __last,                                        _Predicate __pred, _Distance __len) {  if (__len == 1)    return __pred(*__first) ? __last : __first;  _ForwardIter __middle = __first;  advance(__middle, __len / 2);  return rotate(__inplace_stable_partition(__first, __middle, __pred,                                            __len / 2),                __middle,                __inplace_stable_partition(__middle, __last, __pred,                                           __len - __len / 2));}template <class _ForwardIter, class _Pointer, class _Predicate,           class _Distance>_ForwardIter __stable_partition_adaptive(_ForwardIter __first,                                         _ForwardIter __last,                                         _Predicate __pred, _Distance __len,                                         _Pointer __buffer,                                         _Distance __buffer_size) {  if (__len <= __buffer_size) {    _ForwardIter __result1 = __first;    _Pointer __result2 = __buffer;    for ( ; __first != __last ; ++__first)      if (__pred(*__first)) {        *__result1 = *__first;        ++__result1;      }      else {        *__result2 = *__first;        ++__result2;      }    copy(__buffer, __result2, __result1);    return __result1;  }  else {    _ForwardIter __middle = __first;    advance(__middle, __len / 2);    return rotate(__stable_partition_adaptive(                          __first, __middle, __pred,                          __len / 2, __buffer, __buffer_size),                    __middle,                    __stable_partition_adaptive(                          __middle, __last, __pred,                          __len - __len / 2, __buffer, __buffer_size));  }}template <class _ForwardIter, class _Predicate, class _Tp, class _Distance>inline _ForwardIter__stable_partition_aux(_ForwardIter __first, _ForwardIter __last,                        _Predicate __pred, _Tp*, _Distance*){  _Temporary_buffer<_ForwardIter, _Tp> __buf(__first, __last);  _STLP_MPWFIX_TRY		//*TY 06/01/2000 - they forget to call dtor for _Temporary_buffer if no try/catch block is present  return (__buf.size() > 0) ?    __stable_partition_adaptive(__first, __last, __pred,				_Distance(__buf.requested_size()),				__buf.begin(), __buf.size())  :    __inplace_stable_partition(__first, __last, __pred, 			       _Distance(__buf.requested_size()));  _STLP_MPWFIX_CATCH	//*TY 06/01/2000 - they forget to call dtor for _Temporary_buffer if no try/catch block is present}template <class _ForwardIter, class _Predicate>_ForwardIter stable_partition(_ForwardIter __first, _ForwardIter __last, _Predicate __pred) {  _STLP_DEBUG_CHECK(__check_range(__first, __last))  if (__first == __last)    return __first;  else    return __stable_partition_aux(__first, __last, __pred,                                  _STLP_VALUE_TYPE(__first, _ForwardIter),                                  _STLP_DISTANCE_TYPE(__first, _ForwardIter));}template <class _RandomAccessIter, class _Tp, class _Compare>_RandomAccessIter __unguarded_partition(_RandomAccessIter __first,                                         _RandomAccessIter __last,                                         _Tp __pivot, _Compare __comp) {  while (true) {    while (__comp(*__first, __pivot))      ++__first;    --__last;    while (__comp(__pivot, *__last))      --__last;    if (!(__first < __last))      return __first;    iter_swap(__first, __last);    ++__first;  }}// sort() and its auxiliary functions. # define  __stl_threshold  16template <class _RandomAccessIter, class _Tp, class _Compare>void __unguarded_linear_insert(_RandomAccessIter __last, _Tp __val,                                _Compare __comp) {  _RandomAccessIter __next = __last;  --__next;    while (__comp(__val, *__next)) {    *__last = *__next;    __last = __next;    --__next;  }  *__last = __val;}template <class _RandomAccessIter, class _Tp, class _Compare>inline void __linear_insert(_RandomAccessIter __first,                             _RandomAccessIter __last, _Tp __val, _Compare __comp) {		  //*TY 12/26/1998 - added __val as a paramter  //  _Tp __val = *__last;		    //*TY 12/26/1998 - __val supplied by caller  if (__comp(__val, *__first)) {    copy_backward(__first, __last, __last + 1);    *__first = __val;  }  else    __unguarded_linear_insert(__last, __val, __comp);}template <class _RandomAccessIter, class _Compare>void __insertion_sort(_RandomAccessIter __first,                      _RandomAccessIter __last, _Compare __comp) {  if (__first == __last) return;  for (_RandomAccessIter __i = __first + 1; __i != __last; ++__i)    __linear_insert(__first, __i, *__i, __comp);	//*TY 12/26/1998 - supply *__i as __val}template <class _RandomAccessIter, class _Tp, class _Compare>void __unguarded_insertion_sort_aux(_RandomAccessIter __first,                                     _RandomAccessIter __last,                                    _Tp*, _Compare __comp) {  for (_RandomAccessIter __i = __first; __i != __last; ++__i)    __unguarded_linear_insert(__i, _Tp(*__i), __comp);}template <class _RandomAccessIter, class _Compare>inline void __unguarded_insertion_sort(_RandomAccessIter __first,                                        _RandomAccessIter __last,                                       _Compare __comp) {  __unguarded_insertion_sort_aux(__first, __last, _STLP_VALUE_TYPE(__first, _RandomAccessIter), __comp);}template <class _RandomAccessIter, class _Compare>void __final_insertion_sort(_RandomAccessIter __first,                             _RandomAccessIter __last, _Compare __comp) {  if (__last - __first > __stl_threshold) {    __insertion_sort(__first, __first + __stl_threshold, __comp);    __unguarded_insertion_sort(__first + __stl_threshold, __last, __comp);  }  else    __insertion_sort(__first, __last, __comp);}template <class _RandomAccessIter, class _Tp, class _Size, class _Compare>void __introsort_loop(_RandomAccessIter __first,                      _RandomAccessIter __last, _Tp*,                      _Size __depth_limit, _Compare __comp){  while (__last - __first > __stl_threshold) {    if (__depth_limit == 0) {      partial_sort(__first, __last, __last, __comp);      return;    }    --__depth_limit;    _RandomAccessIter __cut =      __unguarded_partition(__first, __last,                            _Tp(__median(*__first,                                         *(__first + (__last - __first)/2),                                         *(__last - 1), __comp)),       __comp);    __introsort_loop(__cut, __last, (_Tp*) 0, __depth_limit, __comp);    __last = __cut;  }}template <class _RandomAccessIter>void sort(_RandomAccessIter __first, _RandomAccessIter __last) {  _STLP_DEBUG_CHECK(__check_range(__first, __last))  if (__first != __last) {    __introsort_loop(__first, __last,                     _STLP_VALUE_TYPE(__first, _RandomAccessIter),                     __lg(__last - __first) * 2, __less(_STLP_VALUE_TYPE(__first, _RandomAccessIter)) );    __final_insertion_sort(__first, __last, __less(_STLP_VALUE_TYPE(__first, _RandomAccessIter)));  }}template <class _RandomAccessIter, class _Compare>void sort(_RandomAccessIter __first, _RandomAccessIter __last, _Compare __comp) {  _STLP_DEBUG_CHECK(__check_range(__first, __last))  if (__first != __last) {    __introsort_loop(__first, __last,                     _STLP_VALUE_TYPE(__first, _RandomAccessIter),                     __lg(__last - __first) * 2,                     __comp);    __final_insertion_sort(__first, __last, __comp);  }}// stable_sort() and its auxiliary functions.template <class _RandomAccessIter, class _Compare>void __inplace_stable_sort(_RandomAccessIter __first,                           _RandomAccessIter __last, _Compare __comp) {  if (__last - __first < 15) {    __insertion_sort(__first, __last, __comp);    return;  }  _RandomAccessIter __middle = __first + (__last - __first) / 2;  __inplace_stable_sort(__first, __middle, __comp);  __inplace_stable_sort(__middle, __last, __comp);  __merge_without_buffer(__first, __middle, __last,                         __middle - __first,                         __last - __middle,                         __comp);}template <class _RandomAccessIter1, class _RandomAccessIter2,          class _Distance, class _Compare>void __merge_sort_loop(_RandomAccessIter1 __first,                       _RandomAccessIter1 __last,                        _RandomAccessIter2 __result, _Distance __step_size,                       _Compare __comp) {  _Distance __two_step = 2 * __step_size;  while (__last - __first >= __two_step) {    __result = merge(__first, __first + __step_size,                     __first + __step_size, __first + __two_step,                     __result,                     __comp);    __first += __two_step;  }  __step_size = (min) (_Distance(__last - __first), __step_size);  merge(__first, __first + __step_size,

⌨️ 快捷键说明

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