(二叉堆)总结:
今天我学习了二叉堆,二叉堆是一种近似的完全二叉树,二叉堆满足二叉树的性质,
除此之外,二叉堆对于节点的大小关系是有一定要求的。
二叉堆的子节点都比根节点大(或者都比根节点小)。
算是一种特殊的完全二叉树。
堆排序就是利用二叉堆来实现的。
堆排序的时间复杂度大概是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日