STL源码分析之heap大根堆

前言

在分析本节之前你至少应该对堆排序有所了解, 大根堆, 小根堆等. 本节分析的heap就是堆排序, 严格意义上来讲heap并不是一个容器, 所以他没有实现自己的迭代器, 也就没有遍历操作, 它只是一种算法. 代码来自stl_heap.h.

heap分析

push插入元素

插入函数是push_heap. heap只接受RandomAccessIterator类型的迭代器.

注意, 在分析heap的时候最好还是自己画一次, 画一个数组一个二叉树.

template <class RandomAccessIterator>
inline void push_heap(RandomAccessIterator first, RandomAccessIterator last) {
   
  __push_heap_aux(first, last, distance_type(first), value_type(first));
}

template <class RandomAccessIterator, class Distance, class T>
inline void __push_heap_aux(RandomAccessIterator first, RandomAccessIterator last, Distance*, T*) 
{
   
    // 这里传入的是两个迭代器的长度, 0, 还有最后一个数据
  __push_heap(first, Distance((last - first) - 1), Distance(0),  T(*(last - 1)));
}

push的核心代码

template <class RandomAccessIterator, class Distance, class T>
void __push_heap(RandomAccessIterator first, Distance holeIndex,Distance topIndex, T value) 
{
   
    // 这里就行二分, 因为二叉树每一行都是2的倍数
  Distance parent = (holeIndex - 1) / 2;
    // 这里判断的是当前没有达到堆顶并且传入的值大于根节点的值, 那就将根节点下移
  while (holeIndex > topIndex && *(first + parent) < value) {
   
      // 将根节点下移
    *(first + holeIndex) = *(first + parent);
    holeIndex = parent;
    parent = 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值