在 O(n) 的时间复杂度内构建最大堆,最大比较次数为 O(n)。
实现方法如下:
void heapify(int arr[], int n, int i)
{
int largest = i;
int l = 2*i + 1;
int r = 2*i + 2;
// 如果左子节点大于根节点
if (l < n && arr[l] > arr[largest])
largest = l;
// 如果右子节点大于根节点
if (r < n && arr[r] > arr[largest])
largest = r;
// 如果最大值不是根节点,则交换
if (largest != i)
{
swap(arr[i], arr[largest]);
// 递归地对子树进行堆化
heapify(arr, n, largest);
}
}
void buildHeap(int arr[], int n)
{
// 从最后一个非叶子节点开始堆化
for (int i = n / 2 - 1; i >= 0; i--)
heapify(arr, n, i);
}