std::sort_heap() algorithm
- since C++20
- until C++20
template< class RandomIt >constexpr void sort_heap( RandomIt first, RandomIt last );// (2)template< class RandomIt, class Compare >constexpr void sort_heap( RandomIt first, RandomIt last, Compare comp );template< class RandomIt >void sort_heap( RandomIt first, RandomIt last );// (2)template< class RandomIt, class Compare >void sort_heap( RandomIt first, RandomIt last, Compare comp );Converts the max heap [first; last) into a sorted range in ascending order.
The resulting range no longer has the heap property.
-
(1) Elements are compared using
operator<. -
(2) Elements are compared using the given binary comparison function
comp.
Parameters
first last | The range of elements to sort. |
policy | The execution policy to use. See execution policy for details. |
comp | Comparison function object (i.e. an object that satisfies the requirements of Compare). The signature of the comparison function should be equivalent to the following:
|
Type requirements
RandomIt | LegacyRandomAccessIterator LegacyRandomAccessIterator |
The type defereferenced RandomIt | MoveAssignable MoveConstructible |
Return value
(none)
Complexity
Given N as std::distance(first, last):
At most 2 * N * log(N) comparisons.
Exceptions
The overloads with a template parameter named ExecutionPolicy report errors as follows:
- If execution of a function invoked as part of the algorithm throws an exception and
ExecutionPolicyis one of the standard policies,std::terminateis called. For any otherExecutionPolicy, the behavior is implementation-defined. - If the algorithm fails to allocate memory,
std::bad_allocis thrown.
Possible implementation
sort_heap(1)
template<class RandomIt>void sort_heap(RandomIt first, RandomIt last){ while (first != last) std::pop_heap(first, last--);}sort_heap(2)
template<class RandomIt, class Compare>void sort_heap(RandomIt first, RandomIt last, Compare comp){ while (first != last) std::pop_heap(first, last--, comp);}Notes
A max heap is a range of elements [f; l) that has the following properties:
- Given
Nasl - f, for all0 < i < N,f[(i - 1) / 2]does not compare less thanf[i]. - A new element can be added using
std::push_heap, in O(log(N)) time. - The first element can be removed using
std::pop_heap, in O(log(N)) time.
Examples
#include <algorithm>#include <iostream>#include <string_view>#include <vector>void println(std::string_view fmt, auto const& v){ for (std::cout << fmt; const auto &i : v) std::cout << i << ' '; std::cout << '\n';}int main(){ std::vector<int> v {3, 1, 4, 1, 5, 9}; std::sort_heap(v.begin(), v.end()); println("after sort_heap, v: ", v); std::sort_heap(v.begin(), v.end()); println("after sort_heap, v: ", v);}after sort_heap, v: 9 4 5 1 1 3after sort_heap, v: 1 1 3 4 5 9Hover to see the original license.