__merge_without_buffer()
performs a merge in place , like the merge step of a merge merge in place. As input, you need to enter two ranges of data [first, middle)
and [middle, last)
, which, as expected, will already be sorted. The parameters len1
and len2
are equal to the lengths of the two input ranges, namely (middle - first)
, (last - middle)
respectively.
. A1 B1 A2 B2
, A1
- [first, middle)
, , , A2
- [first, middle)
B1
[middle, last)
, , B2
- [middle, last)
, . , A1 A2 B1 B2
, , , A2 B1
B1 A2
. std::rotate()
, .
, , (A1
B1
), , pivot (A2
B2
), A1 A2
B1 B2
.
? , , (.. [first, middle)
, [middle, last)
, [first, middle)
, [middle, last)
). , . , 3/4 , 1/4 , .
? std::rotate()
O (N), . O (N log N). , mergesort: , mergesort , . , mergesort :
T(N) = 2T(N/2) + O(N log N)
-, , mergesort O (N log 2 N ) !
:
2 - quicksort (1) (3), mergesort (2) (3), (1) (2). , , , 3, . , , 3, , , .