最小根堆和最大根堆

本文介绍了堆排序的基本概念,区分了大顶堆与小顶堆,并详细解释了如何通过调整实现大根堆与小根堆。同时,给出了具体的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

初始序列为1 8 6 2 5 4 7 3一组数采用堆排序,当建堆(小根堆)完毕时,堆所对应的二叉树中序遍历序列为:(A)
  • 8 3 2 5 1 6 4 7
  • 3 2 8 5 1 4 6 7
  • 3 8 2 5 1 6 7 4
  • 8 2 3 5 1 4 7 6

图解如下:


堆实际上是一棵完全二叉树,其任何一非叶节点满足性质:
Key[i]<=key[2i+1]&&Key[i]<=key[2i+2]或者Key[i]>=Key[2i+1]&&key>=key[2i+2]
即任何一非叶节点的关键字不大于或者不小于其左右孩子节点的关键字。

堆分为大顶堆和小顶堆,满足Key[i]>=Key[2i+1]&&key>=key[2i+2]称为大顶堆,满足 Key[i]<=key[2i+1]&&Key[i]<=key[2i+2]称为小顶堆。由上述性质可知大顶堆的堆顶的关键字肯定是所有关键字中最大的,小顶堆的堆顶的关键字是所有关键字中最小的。

大根堆实现如下:

//大根堆调整
void MaxHeapify(int* array, int heapSize, int currentNode)
{
	int leftChild = currentNode * 2 + 1;
	int rightChild = currentNode * 2 + 2;
	int largest = currentNode;

	if (leftChild < heapSize && array[leftChild] > array[currentNode])
	{
		largest = leftChild;
	}

	if (rightChild < heapSize && array[rightChild] > array[currentNode])
	{
		largest = rightChild;
	}

	if (largest != currentNode)
	{
		swap(array, currentNode, largest);
		MaxHeapify(array, heapSize, largest);
	}
}

//创建大根堆
void MaxHeapCreate(int* array, int heapSize)
{
	for (int i = heapSize / 2; i >= 0; i--)
	{
		MaxHeapify(array, heapSize, i);
	}
}

小根堆实现如下:

//小根堆调整
void MinHeapify(int* array, int heapSize, int currentNode)
{
	int leftChild = currentNode * 2 + 1;
	int rightChild = currentNode * 2 + 2;
	int smallest = currentNode;

	if (leftChild < heapSize && array[leftChild] < array[smallest])
	{
		smallest = leftChild;
	}

	if (rightChild < heapSize && array[rightChild] < array[smallest])
	{
		smallest = rightChild;
	}

	if (smallest != currentNode)
	{
		swap(array, smallest, currentNode);
		MinHeapify(array, heapSize, smallest);
	}
}

//创建小根堆
void MinHeapCreate(int* array, int heapSize)
{
	for (int i = heapSize / 2; i >= 0; i--)
	{
		MinHeapify(array, heapSize, i);
	}
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值