博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【数据结构第四周】树知识点整理(下)【堆】
阅读量:6453 次
发布时间:2019-06-23

本文共 1738 字,大约阅读时间需要 5 分钟。

队列中,调度程序反复提取队列中第一个作业并运行,因为实际情况中某些时间较短的任务将等待很长时间才能结束,或者某些不短小,但具有重要性的作业,同样应当具有优先权。堆即为解决此类问题设计的一种数据结构。

1、堆的两个特性

结构性:用数组表示的完全二叉树

有序性:任一结点的关键字是其子树所有结点的最大值(或最小值)

最大堆(MaxHeap)”,也称“大顶堆”:最大值 

最小堆(MinHeap)”,也称“小顶堆” :最小值 

2、

typedef struct HeapStruct *MaxHeap; struct HeapStruct {	ElementType *Elements; /* 存储堆元素的数组 */	int Size;/*堆的当前元素个数*/	int Capacity;/*堆的最大容量*/};

 

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、将新增结点插入到从其父结点到根结点的有序序列中 

/* 将元素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、删除最大堆中的最大值元素

/* 从最大堆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;}

 

 

 

转载于:https://www.cnblogs.com/acmsummer/p/4251726.html

你可能感兴趣的文章
poi java web_WebPOI JavaWeb 项目 导出excel表格(.xls) Develop 238万源代码下载- www.pudn.com...
查看>>
java 顶点着色_金属顶点着色器绘制纹理点
查看>>
php扩展有哪些G11,php 几个扩展(extension)的安装笔记
查看>>
ajax长连接 php,ajax怎么实现服务器与浏览器长连接
查看>>
oracle报1405,【案例】Oracle报错ORA-15054 asm diskgroup无法mount的解决办法
查看>>
php 5.4.24 win32,PHP 5.4.14 和 PHP 5.3.24 发布
查看>>
oracle top pid,Linux Top 命令解析 比较详细
查看>>
grub如何进入linux系统,Linux操作系统启动管理器-GRUB
查看>>
linux pbs 用户时间,【Linux】单计算机安装PBS系统(Torque)与运维
查看>>
linux系统可用内存减少,在Linux中检查可用内存的5种方法
查看>>
linux 脚本map,Linux Shell Map的用法详解
查看>>
如何在linux系统下配置共享文件夹,如何在windows和Linux系统之间共享文件夹.doc
查看>>
thinkpad装linux无线网卡驱动,ThinkPad E530 Fedora 20 下无线网卡驱动的安装
查看>>
linux操作系统加固软件,系统安全:教你Linux操作系统的安全加固
查看>>
linux中yum源安装dhcp,24.Linux系统下动态网络源部署方法(dhcpd)
查看>>
linux屏幕复制显示出来的,linux – stdout到gnu屏幕复制缓冲区
查看>>
一起学Shell(十)之可称植性议题与扩展
查看>>
部署Ganglia监控Hadoop&Hbase
查看>>
gitlab的用户使用手册
查看>>
论Optimizer的工作模式ALL_ROWS&FIRST_ROWS
查看>>