STL算法之merge sort

        在 STL算法之其它算法_下-优快云博客 中,我们对inplace_merge进行了简要的描述,但是对里面的细节描述的不是很清晰;本章进行更细致的拆解;同时inplace_merge将使用merge sort作为实现算法的主要手段。

目录

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()));

}

        这个算法如果有额外的内存(缓冲区)辅助,效率会好很多。但是在没有缓冲区或缓冲区不足的情况下,也可以运作,为了篇幅,我们接下来的源码主要讨论有缓冲区的情况。

<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大明__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值