第六章堆排序之“删除最大堆中的指定元素HEAP-DELETE”(练习6.5-7)

该博客介绍了如何在最大堆中以O(logn)的时间复杂度删除指定元素。通过将堆尾元素替换到要删除的位置,然后根据新元素与原元素的大小关系进行不同方式的堆调整,包括无需调整、调用MaxHeapify或HeapIncreaseKey函数。整个过程确保了堆的性质得以维护。
摘要由CSDN通过智能技术生成

题目:HEAP-DELETE(A,i)操作将节点i中的项从堆中删去。对含n个元素的最大堆,请给出时间为O(lgn)的HEAP-DELETE的实现。

编程思路:

我们可以用堆中最后一个元素a[heapSize]放到节点i 位置,然后将heapSize减一。然后就涉及到堆调整以保持堆的性质。

调整的依据就是这最后一个元素a[heapSize]跟原来i节点的元素a[i]的相对大小,分三种情况:

(1)当a[heapSize]==a[i]时,最大堆不用调整。时间复杂度为O(1)

(2)当a[heapSize]<a[i]时,以i节点为根的子分支堆性质遭到破坏,其他地方不变,所以这里直接调用保持堆性质的函数MaxHeapIfy()进行堆调整即可。时间复杂度为O(lgn)

(3)当a[heapSize]>a[i]时,这种情况类似于“将优先队列的某个元素关键字值增大到k”的操作,所以直接调用HeapIncreaseKey()函数即可。时间复杂度为O(lgn)


实现代码如下:

//堆调整,保持堆的性质 
void MaxHeapIfy(int *a,int i,int heapSize)
{
	int largest=0;
	int left=0;
	int right=0;
	int tmp=0;
	
	if(left<=heapSize&&a[i]<a[left])
	{
		largest=left;
	}
	else
	{
		largest=i;
	}
	if(right<&#
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值