堆其实就是一棵完全二叉树(若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边)。

父节点总是大于或等于子节点,这种情况下被叫作大顶堆,或者父节点总是小于或等于子节点,这种情况下叫作小顶堆。注意,给定父节点的子节点不一定按顺序排列。

堆不是容器,而是一种特殊的数据组织方式。

STL中堆的实现

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <time.h>
using namespace std;


int main()
{
    std::vector<double>numbers{ 2.5,10.0,3.5,6.5,8.0,12.0,1.5,6.0 };
    std::make_heap(std::begin(numbers), std::end(numbers));
    //默认使用<运算符,生成大顶堆,Result: 12 10 3.5 6.5 8 2.5 1.5 6
    /*添加元素*/
    numbers.push_back(11); // Result: 12 10 3.5 6.5 8 2.5 1.5 6 11
    std::push_heap(std::begin(numbers), std::end(numbers));//调用push_heap恢复堆顺序
    // Result: 12 11 3. 5 10 8 2. 5 1. 5 6 6. 5
    /*删除最大元素*/
    std::pop_heap(std::begin(numbers), std::end(numbers));//pop_heap将首元素下沉到最后
    //Result: 11 10 3.5 6.5 8 2.5 1.5 6 12
    numbers.pop_back();
    //Result: 11 10 3.5 6.5 8 2.5 1.5 6
    if (std::is_heap(std::begin(numbers), std::end(numbers)))
        std::cout << "Great! We still have a heap.\n";
    else
        std::cout << "oh bother! We messed up the heap.\n";
    system("pause");
    return 0;
}
View Code

 

posted @ 2019-11-22 10:59  summer91  阅读(140)  评论(0编辑  收藏  举报