【数据结构第四周】树知识点整理(下)【堆】
在队列中,调度程序反复提取队列中第一个作业并运行,因为实际情况中某些时间较短的任务将等待很长时间才能结束,或者某些不短小,但具有重要性的作业,同样应当具有优先权。堆即为解决此类问题设计的一种数据结构。
1、堆的两个特性
结构性:用数组表示的完全二叉树
有序性:任一结点的关键字是其子树所有结点的最大值(或最小值)
最大堆(MaxHeap)”,也称“大顶堆”:最大值
最小堆(MinHeap)”,也称“小顶堆” :最小值
2、
1 2 3 4 5 6 | typedef struct HeapStruct *MaxHeap; struct HeapStruct { ElementType *Elements; /* 存储堆元素的数组 */ int Size; /*堆的当前元素个数*/ int Capacity; /*堆的最大容量*/ }; |
1 2 3 4 5 6 7 8 9 10 | MaxHeap Create( int MaxSize ) { MaxHeap H = malloc ( sizeof ( struct HeapStruct ) ); /* 创建容量为MaxSize的空的最大堆 */ H->Elements = malloc ( (MaxSize+1) * sizeof (ElementType)); H->Size = 0; H->Capacity = MaxSize; H->Elements[0] = MaxData; /* 定义“哨兵”为大于堆中所有可能元素的值,便于以后更快操作 */ return H; } |
3、将新增结点插入到从其父结点到根结点的有序序列中
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | /* 将元素item 插入最大堆H,其中H->Elements[0]已经定义为哨兵 */ void Insert( MaxHeap H, ElementType item ) { int i; if ( IsFull(H) ) { printf ( "最大堆已满" ); return ; } i = ++H->Size; /* i指向插入后堆中的最后一个元素的位置 */ for ( ; H->Elements[i/2] < item; i/=2 ) { H->Elements[i] = H->Elements[i/2]; /* 向下过滤结点 */ } H->Elements[i] = item; /* 将item 插入 */ } |
4、删除最大堆中的最大值元素
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | /* 从最大堆H中取出键值为最大的元素,并删除一个结点 */ ElementType DeleteMax( MaxHeap H ) { int Parent, Child; ElementType MaxItem, temp; if ( IsEmpty(H) ) { printf ( "最大堆已为空" ); return ; } MaxItem = H->Elements[1]; /* 取出根结点最大值 */ /* 用最大堆中最后一个元素从根结点开始向上过滤下层结点 */ temp = H->Elements[H->Size--]; for ( Parent=1; Parent*2<=H->Size; Parent=Child ) { Child = Parent * 2; if ( (Child!= H->Size) && (H->Elements[Child] < H->Elements[Child+1]) ) { Child++; /* Child指向左右子结点的较大者 */ } if ( temp >= H->Elements[Child] ) break ; else /* 移动temp元素到下一层 */ H->Elements[Parent] = H->Elements[Child]; } H->Elements[Parent] = temp; return MaxItem; } |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步