在 STL算法之其它算法_下-优快云博客 中,我们对inplace_merge进行了简要的描述,但是对里面的细节描述的不是很清晰;本章进行更细致的拆解;同时inplace_merge将使用merge sort作为实现算法的主要手段。
目录
inplace_merge(应用于有序区间)
如果两个连接在一起的序列[first,middle)和[middle,last)都已经排序,那么inplace_merge可将它们结合成单一一个序列,并仍保有序性。如果原先两个序列式递增排序,执行结果也会是递增序列,如果原先两个徐磊是递减序列,执行结果也会是递减序列。
和merge一样,inplace_merge也是一种稳定操作。每个作为数据来源的子序列中的元素相对次序都不会变动;如果两个子序列有等同的元素,第一序列的元素会被排在第二元素之前。
inplace_merge 默认使用operator<作为排序依据,同时可接受仿函数comp作为比较运算符的替代。默认源码如下:
template <class BidrectionalIterator>
inline void inplace_merge(BidrectionalIterator first,
BidrectionalIterator middle,
BidrectionalIterator last) {
if (first == middle || middle == last) return ;
__inplace_merge_aux(first, middle, last, value_type(first), distance_type(first));
}
template <class BidrectionalIterator, class T, class Distance>
inline void inplace_merge_aux(BidrectionalIterator first,
BidrectionalIterator middle,
BidrectionalIterator last
T*, Distance*) {
Distance len1 = 0;
distance(first, middle, len1);
Distance len2 = 0;
distance(middle, last, len2);
//注意,本算法会使用额外的内存空间(暂时缓冲区)
temporary_buffer<BidrectionIterator, T> buf(first, last);
if (buf.begin() == 0) // 内存配置失败
__merge_without_buffer(first, middle, last, len1, len2);
else
_merge_adaptive(first, middle, last, len1, len2, buf, buf.begin(), Distance(buf.size()));
}
这个算法如果有额外的内存(缓冲区)辅助,效率会好很多。但是在没有缓冲区或缓冲区不足的情况下,也可以运作,为了篇幅,我们接下来的源码主要讨论有缓冲区的情况。
<