初始序列为1 8 6 2 5 4 7 3一组数采用堆排序,当建堆(小根堆)完毕时,堆所对应的二叉树中序遍历序列为:(A)
Key[i]<=key[2i+1]&&Key[i]<=key[2i+2]或者Key[i]>=Key[2i+1]&&key>=key[2i+2]
即任何一非叶节点的关键字不大于或者不小于其左右孩子节点的关键字。
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);
}
}