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

题目: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]

(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]1&&a[x>>1]>1];
		a[x>>1]=tmp;
		
		x>>=1;
	}
}

//删除堆中指定元素i
void HeapDelete(int *a,int i,int *heapSize)
{
	int tmp=a[*heapSize];
	
	if(a[i]==tmp)
	{
		(*heapSize)--;
	}
	else if(a[i]>tmp)//i节点换成较小的tmp后,所在分支的最大堆性质可能遭到破坏,要进行调整 
	{
		a[i]=tmp;
		(*heapSize)--;
		MaxHeapIfy(a,i,*heapSize);
	}
	else if(a[i]>tmp)//i节点的值增大到更大的tmp 
	{
		(*heapSize)--;
		HeapIncreaseKey(a,i,tmp);
	}
} 

int main()
{
	return 0;
}


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