官术网_书友最值得收藏!

  • Mastering the C++17 STL
  • Arthur O'Dwyer
  • 201字
  • 2021-07-08 10:20:24

Merges and mergesort

As long as we're on the topic of sorting algorithms, let's write sort a different way!

std::inplace_merge(a,mid,b) takes a single range [a,b) which has already been sorted with the equivalent of std::sort(a,mid) and std::sort(mid,b), and merges the two subranges together into a single sorted range. We can use this building block to implement the classic mergesort algorithm:

    template<class RandomIt>
void sort(RandomIt a, RandomIt b)
{
auto n = std::distance(a, b);
if (n >= 2) {
auto mid = a + n/2;
std::sort(a, mid);
std::sort(mid, b);
std::inplace_merge(a, mid, b);
}
}

However, beware! The name inplace_merge seems to imply that the merging is happening "in-place" without the need for any additional buffer space; but this is not what happens in fact. In actuality, the inplace_merge function allocates a buffer for its own use, typically by calling operator new. If you are programming in an environment where heap allocation is problematic, then you should avoid inplace_merge like the plague.

The other standard algorithms that may allocate temporary buffers on the heap are std::stable_sort and std::stable_partition.

std::merge(a,b,c,d,o) is the non-allocating merge algorithm; it takes two iterator-pairs representing the ranges [a,b) and [c,d) and merges them into the output range defined by o.

主站蜘蛛池模板: 通海县| 金华市| 思南县| 元朗区| 临武县| 安陆市| 林州市| 台州市| 阿克苏市| 美姑县| 连江县| 宜川县| 隆安县| 大化| 闽清县| 武乡县| 泌阳县| 博客| 绥化市| 祁门县| 临泽县| 建平县| 双桥区| 临安市| 潼关县| 牙克石市| 壤塘县| 靖州| 满城县| 平顶山市| 凤翔县| 淮南市| 雷波县| 措美县| 县级市| 达孜县| 蒲城县| 敦煌市| 个旧市| 丹江口市| 阳西县|