码迷,mamicode.com
首页 > 其他好文 > 详细

堆模板

时间:2018-08-03 21:20:16      阅读:154      评论:0      收藏:0      [点我收藏+]

标签:heap   删除   集中   clu   c++   while   div   col   mes   

【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 }

 

堆模板

标签:heap   删除   集中   clu   c++   while   div   col   mes   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!