每日总结(18.5.29)

(二叉堆)总结:

今天我学习了二叉堆,二叉堆是一种近似的完全二叉树,二叉堆满足二叉树的性质,

除此之外,二叉堆对于节点的大小关系是有一定要求的。

二叉堆的子节点都比根节点大(或者都比根节点小)。

算是一种特殊的完全二叉树。

堆排序就是利用二叉堆来实现的。

堆排序的时间复杂度大概是O(log)n,与其他排序相比,

算是比较快了,所以我觉得二叉堆还是很重要的。

二叉堆的模板写起来也比较简单,

大概代码:

 1 void up(int x)//上浮 
 2 {
 3     while(x!=1)
 4     {
 5         if(a[x]<a[x/2])
 6         swap(a[x],a[x/2]);
 7         else
 8         break;
 9         x=x/2;
10     }
11 }
12 void down(int x)//下沉 
13 {
14     int t=x;
15     while(x*2<=cnt)
16     {
17         if(a[x]>a[x*2])
18         t=x*2;
19         if(x*2+1<=cnt)
20         {
21             if(a[t]>a[x*2+1])
22             t=x*2+1;
23         }
24         if(t==x)
25         break;
26         swap(a[t],a[x]);
27         x=t;
28     }
29 }
30 void po()//将根节点弹出(出队) 
31 {
32     a[1]=a[cnt];
33     cnt--;
34     down(1);
35 }
36 void add(int x)//插入(入队) 
37 {
38     a[++cnt]=x;
39     up(cnt);
40 }

其实二叉堆用优先队列来写应该比较方便,听说c++优先队列自带堆排序,但是由于我是初学(老师要求)

于是今天做的几题全都是用函数写的堆。堆的基本模板题我已经都会做了。总之,今天学到了很多吧。

                                          ——5月29日

猜你喜欢

转载自www.cnblogs.com/JRZZTD/p/9108330.html