This page is a snapshot from the LWG issues list, see the Library Active Issues List for more information and the meaning of LEWG status.
inplace_merge exact comparison count complexity prohibits useful real-world optimizationsSection: 26.8.6 [alg.merge] Status: LEWG Submitter: Billy Robert O'Neal III Opened: 2017-06-08 Last modified: 2025-10-21
Priority: 4
View all other issues in [alg.merge].
View all issues with LEWG status.
Discussion:
At the moment, inplace_merge requires exactly N - 1 comparisons, if enough additional memory is 
available (and in practice enough additional memory is always available). However, this prohibits implementing the 
merge operation using forms of binary search, as in Timsort's 
'Galloping Mode', a useful optimization 
for non-uniform input data. It's not really useful to prohibit standard libraries from trying a few extra speculative 
compares like this, given that users must be prepared for the fallback "not enough memory" 
𝒪(N lg N) algorithm.
[2017-07 Toronto Monday issue prioritization]
Status to LEWG
[2025-10-21; Priority set to 4 based on age of issue and lack of activity.]
Proposed resolution:
This wording is relative to N4659.
Edit 26.8.6 [alg.merge] as indicated:
template<class BidirectionalIterator> void inplace_merge(BidirectionalIterator first, BidirectionalIterator middle, BidirectionalIterator last); template<class ExecutionPolicy, class BidirectionalIterator> void inplace_merge(ExecutionPolicy&& exec, BidirectionalIterator first, BidirectionalIterator middle, BidirectionalIterator last); template<class BidirectionalIterator, class Compare> void inplace_merge(BidirectionalIterator first, BidirectionalIterator middle, BidirectionalIterator last, Compare comp); template<class ExecutionPolicy, class BidirectionalIterator, class Compare> void inplace_merge(ExecutionPolicy&& exec, BidirectionalIterator first, BidirectionalIterator middle, BidirectionalIterator last, Compare comp);[…]
-8- Complexity: LetN = last - first:
(8.1) — For the overloads with no
ExecutionPolicy, if enough additional memory is available,exactlyN - 1comparisons on average, 𝒪(N) comparisons in the worst case.(8.2) — For the overloads with no
ExecutionPolicyif no additional memory is available, 𝒪(N log N) comparisons.(8.3) — For the overloads with an
ExecutionPolicy, 𝒪(N log N) comparisons.-9- Remarks: Stable (16.4.6.8 [algorithm.stable]).