手写堆

Posted hhyx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了手写堆相关的知识,希望对你有一定的参考价值。

 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 }

 

以上是关于手写堆的主要内容,如果未能解决你的问题,请参考以下文章

前端面试题之手写promise

数据结构:堆手写

手写堆

2019秋招复习笔试--手写代码

c++手写堆

Luogu [P1334] 瑞瑞的木板(手写堆)