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

手写堆

时间:2020-03-15 10:09:43      阅读:70      评论:0      收藏:0      [点我收藏+]

标签:手写堆   for   wap   建堆   top   建立   小根堆   编号   remove   

 1 for(int i=1;i<=n;i++)
 2     cin>>h[i];
 3 size=n;
 4 for(int i=n/2;i;i--)
 5     down(i);
 6 //建堆,根据完全二叉树的性质,n/2后的都是叶子结点,只需要把所有的根结点从后往前down一遍就完成了堆的建立
 7 
 8 
 9 //小根堆
10 int h[N];
11 int idx[N];//存的是第k个插入的点在堆中的位置,即下标
12 int no[N];//存的是下标为k的点是第几个插入的
13 int size,no_;//size为下标,no为第几个插入的编号
14 inline void heap_swap(int a,int b){
15     swap(idx[no[a]],idx[no[b]]);
16     swap(no[a],no[b]);
17     swap(h[a],h[b]);
18 }
19 inline void up(int u){
20     while(u/2 && h[u]<h[u/2]){
21         heap_swap(u,u/2);
22         u>>=1;
23     }
24 }
25 inline void down(int u){
26     int t=u;
27     if(u*2<=size && h[u*2]<h[t])
28         t=u*2;
29     if(u*2+1<=size && h[u*2+1]<h[t])
30         t=u*2+1;
31     if(u!=t){
32         heap_swap(u,t);
33         down(t);
34     }
35 }
36 inline void insert(){
37     int x;
38     cin>>x;
39     no_++;
40     h[++size]=x;
41     idx[no_]=size;
42     no[size]=no_;
43     up(size);
44 }
45 inline void poptop(){
46     heap_swap(1,size);
47     size--;
48     down(1);
49 }
50 inline void remove(int p){
51     heap_swap(p,size--);
52     up(p),down(p);
53 }

 

手写堆

标签:手写堆   for   wap   建堆   top   建立   小根堆   编号   remove   

原文地址:https://www.cnblogs.com/hhyx/p/12495742.html

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