6.2-1
操作过程如下图:
6.2-2
MIN-HEAPIFY(A, i)
l = LEFT(i)
r = RIGHT(i)
if l ≤ A.heap-size and A[l] < A[i]
smallest = l
else smallest = i
if r ≤ A.heap-size and A[r] < A[i]
smallest = r
if smallest ≠ i
exchange A[i] with A[smallest]
MIN-HEAPIFY(A, smallest)
运行时间和MAX_HEAPIFY
一样。
6.2-3
没有什么效果。
6.2-4
没什么结果。
6.2-5
伪代码略,贴出实际代码如下:
#define LEFT(i) (2 * i + 1)
#define RIGHT(i) (2 * i + 2)
void MAX_HEAPIFY(int *array,int i,int heapSize) //第一个元素下标从0开始
{
int largest;
while(1)
{
if(LEFT(i) < heapSize && *(array + LEFT(i)) > *(array + i))
largest = LEFT(i);
else largest = i;
if(RIGHT(i) < heapSize && *(array + RIGHT(i)) > *(array + largest))
largest = RIGHT(i);
if(largest != i)
{
int temp = *(array + i);
*(array + i) = *(array + largest);
*(array + largest) = temp;
i = largest;
}
else return;
}
}
6.2-6
最坏情况是从根结点开始调用MAX_HEAPIFY
,然后根结点的孩子结点继续调用MAX_HEAPIFY
,每层调用一次MAX_HEAPIFY
直至叶子结点,运行时间为
Ω(lgn)
。