首页 > 其他 > 详细

堆模板

时间:2018-08-03 21:04:53      阅读:201      评论:0      收藏:0      [点我收藏+]

【emmm】

    堆其实就是一个完全二叉树:叶子节点都在最后两层且集中在左侧。大(小)根堆的定义就是:每一个节点的权值大于等于(小于等于)其左右儿子(若存在)。

    支持的操作有:

        插入

        删除(根节点或者非根节点)

        查询根的权值

【代码】

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int heap[100010],tot;
 4 void up(int p)
 5 {
 6     while(p>1)
 7         if(heap[p]>heap[p/2]) 
 8             swap(heap[p],heap[p/2]), p/=2;
 9         else break;
10 }
11 void Insert(int val)
12 {
13     heap[++tot]=val;
14     up(tot);
15 }
16 void down(int p)
17 {
18     int s=p*2;
19     while(s<=tot) {
20         if(s<tot&&heap[s]<heap[s+1]) s++;
21         if(heap[s]>heap[p]) swap(heap[s],heap[p]),p=s,s*=2;
22         else break;
23     }
24 }
25 void Extract()
26 {
27     heap[1]=heap[n--];
28     down(1);
29 }
30 void Remove(int p)
31 {
32     heap[p]=heap[n--];
33     up(p),down[p];
34 }

 

堆模板

原文:https://www.cnblogs.com/Willendless/p/9416242.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!