diff --git a/libstdc++-v3/include/bits/stl_algo.h b/libstdc++-v3/include/bits/stl_algo.h index d8488a7..bf5b25f 100644 --- a/libstdc++-v3/include/bits/stl_algo.h +++ b/libstdc++-v3/include/bits/stl_algo.h @@ -1577,15 +1577,15 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } _ForwardIterator __middle = __first; - std::advance(__middle, __len / 2); + std::advance(__middle, __buffer_size); _ForwardIterator __left_split = - std::__stable_partition_adaptive(__first, __middle, __pred, - __len / 2, __buffer, - __buffer_size); + std::__stable_partition_adaptive(__first, __middle, + __pred, __buffer_size, + __buffer, __buffer_size); // Advance past true-predicate values to satisfy this // function's preconditions. - _Distance __right_len = __len - __len / 2; + _Distance __right_len = __len - __buffer_size; _ForwardIterator __right_split = std::__find_if_not_n(__middle, __right_len, __pred); @@ -2432,9 +2432,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _BidirectionalIterator __second_cut = __middle; _Distance __len11 = 0; _Distance __len22 = 0; - if (__len1 > __len2) + if (__len1 < __len2) { - __len11 = __len1 / 2; + __len11 = __buffer_size; std::advance(__first_cut, __len11); __second_cut = std::__lower_bound(__middle, __last, *__first_cut, @@ -2443,7 +2443,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } else { - __len22 = __len2 / 2; + __len22 = __buffer_size; std::advance(__second_cut, __len22); __first_cut = std::__upper_bound(__first, __middle, *__second_cut, @@ -2453,14 +2453,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _BidirectionalIterator __new_middle = std::__rotate_adaptive(__first_cut, __middle, __second_cut, - __len1 - __len11, __len22, __buffer, - __buffer_size); - std::__merge_adaptive(__first, __first_cut, __new_middle, __len11, - __len22, __buffer, __buffer_size, __comp); + __len1 - __len11, __len22, + __buffer, __buffer_size); + std::__merge_adaptive(__first, __first_cut, __new_middle, + __len11, __len22, + __buffer, __buffer_size, __comp); std::__merge_adaptive(__new_middle, __second_cut, __last, - __len1 - __len11, - __len2 - __len22, __buffer, - __buffer_size, __comp); + __len1 - __len11, __len2 - __len22, + __buffer, __buffer_size, __comp); } } @@ -2535,7 +2535,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION const _DistanceType __len2 = std::distance(__middle, __last); typedef _Temporary_buffer<_BidirectionalIterator, _ValueType> _TmpBuf; - _TmpBuf __buf(__first, __len1 + __len2); + _TmpBuf __buf(__first, std::min(__len1, __len2)); if (__buf.begin() == 0) std::__merge_without_buffer @@ -2730,9 +2730,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _Compare __comp) { const _Distance __len = (__last - __first + 1) / 2; - const _RandomAccessIterator __middle = __first + __len; + _RandomAccessIterator __middle; if (__len > __buffer_size) { + __middle = __first + __buffer_size + __buffer_size; std::__stable_sort_adaptive(__first, __middle, __buffer, __buffer_size, __comp); std::__stable_sort_adaptive(__middle, __last, __buffer, @@ -2740,9 +2741,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } else { + __middle = __first + __len; std::__merge_sort_with_buffer(__first, __middle, __buffer, __comp); std::__merge_sort_with_buffer(__middle, __last, __buffer, __comp); } + std::__merge_adaptive(__first, __middle, __last, _Distance(__middle - __first), _Distance(__last - __middle), @@ -4992,8 +4995,11 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO typedef typename iterator_traits<_RandomAccessIterator>::difference_type _DistanceType; + if (__first == __last) + return; + typedef _Temporary_buffer<_RandomAccessIterator, _ValueType> _TmpBuf; - _TmpBuf __buf(__first, std::distance(__first, __last)); + _TmpBuf __buf(__first, (__last - __first + 1) / 2); if (__buf.begin() == 0) std::__inplace_stable_sort(__first, __last, __comp); diff --git a/libstdc++-v3/include/bits/stl_tempbuf.h b/libstdc++-v3/include/bits/stl_tempbuf.h index 159ee27..7fb97d0 100644 --- a/libstdc++-v3/include/bits/stl_tempbuf.h +++ b/libstdc++-v3/include/bits/stl_tempbuf.h @@ -95,7 +95,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION std::nothrow)); if (__tmp != 0) return std::pair<_Tp*, ptrdiff_t>(__tmp, __len); - __len /= 2; + __len = __len == 1 ? 0 : ((__len + 1) / 2); } return std::pair<_Tp*, ptrdiff_t>(static_cast<_Tp*>(0), 0); }