来自度娘的释义,堆的含义大概是这样的:c++
感性理解:算法
堆(英语:heap)是计算机科学中一类特殊的数据结构的统称。堆一般是一个能够被看作一棵树的数组对象。堆老是知足下列性质:
堆中某个节点的值老是不大于或不小于其父节点的值; 堆老是一棵彻底二叉树。将根节点最大的堆叫作最大堆或大根堆,根节点最小的堆叫作最小堆或小根堆。常见的堆有二叉堆、斐波那契堆等。
理性理解:数组
堆的定义以下:n个元素的序列{k1,k2,ki,…,kn}当且仅当知足下关系时,称之为堆。(k i <= k 2i,k i <= k 2i+1)或者(k i >= k 2i,k i >= k 2i+1), (i = 1,2,3,4...n/2)
然而手写堆实在太困难有点长了,在NOIp&&NOI赛场上时间有限,因此一个模板的重要性不言而喻;(好比我排序向来都是sort数据结构
会手写堆的都是神犇!less
真的!函数
反正我写不了2333oop
因此上帝为可爱的c++党准备了贴身的STL模板-->heap;spa
默认用法 (但这样生成的是大根堆;若是须要构建小根堆,须要进行修改。.net
Eg:c++11
1 vector<int> v{6, 1, 2, 5, 3, 4}; 2 make_heap(v.begin(), v.end());
自建小根堆
Eg:自定义比较函数:(彷佛是这样我并不太懂
1 vector<int> v{6, 1, 2, 5, 3, 4}; 2 make_heap(v.begin(), v.end(), greater<int>());
这里使用了greater<int>()
来代替默认的less<int>()
来建立int类型的heap。
能够按层次遍历的顺序把这个heap画出来,能够看到它跟默认状况恰好相反,会是一个小顶堆。
push_heap 把指定区间的最后一个元素插入到堆中
2 push_heap(v.begin(), v.end());
注意:须要知足的是此时的v必须知足是一个在区间(v.begin(), v.end())内知足堆的性质;不能直接比较23333
因此我一直以为即便手写堆也可使用模板
毕竟我不会写
这样就比较简单。
pop_heap 把指定区间的最后一个元素插入到堆中
好比这样:
2 auto largest = v.back();
3 psln(largest);
4 v.pop_back();
依旧须要知足v是一个堆;
并且他会将除最大值之外的节点重排;而v.back( )便将其找到了;
因此删除它只须要令v.back()=0就好了。
海星
pop_heap 把指定区间的最后一个元素插入到堆中
sort_heap(v.begin(), v.end()); printContainer(v, "after sort_heap: ");
堆排序;
没了
c++11里面的玄学东西高考完再说
如今不敢用
毕竟我是一个联赛选手
引用资料:
【C++ STL应用与实现】72: 标准库里的堆--如何使用标准库的heap算法 https://blog.csdn.net/elloop/article/details/53402209