CLRS Chapter 6
介绍
主要为 Binary Heap,分为 max-heap 和 min-heap,以 max-heap 为例
从上往下二叉而下,Parent 一定大于 Children,Children 之间不可比
Index 为从上到下,从左到右
特性
- n-element height =
和 Memory 中的 heap 区分
- 维护 Heap 由两部分组成
maxHeapify
- recursively find largest among the three and move the largest up, then do the same thing to make sure it fit in the right position
- Top down
buildMaxHeap
- bottom up iteration to up, starting from the leaf’s parent.
- Bottom up
- Used in heap sort
void heapify(int arr[], int N, int i)
{
// Initialize largest as root
int largest = i;
// left = 2*i + 1
int l = 2 * i + 1;
// right = 2*i + 2
int r = 2 * i + 2;
// If left child is larger than root
if (l < N && arr[l] > arr[largest])
largest = l;
// If right child is larger than largest
// so far
if (r < N && arr[r] > arr[largest])
largest = r;
// If largest is not root
if (largest != i) {
swap(arr[i], arr[largest]);
// Recursively heapify the affected sub-tree
heapify(arr, N, largest);
}
}
void buildMaxHeap(int heap[])
{
int length = sizeof(heap) / sizeof(heap[0]);
for (int i = length / 2; i > -1; i--)
{
maxHeapify(heap, i);
}
}
def heapify(arr, n, i):
largest = i # Initialize largest as root
l = 2 * i + 1 # left = 2*i + 1
r = 2 * i + 2 # right = 2*i + 2
# See if left child of root exists and is greater than root
if l < n and arr[l] > arr[largest]:
largest = l
# See if right child of root exists and is greater than root
if r < n and arr[r] > arr[largest]:
largest = r
# Change root, if needed
if largest != i:
arr[i], arr[largest] = arr[largest], arr[i] # swap
# Heapify the root.
heapify(arr, n, largest)
def heapSort(arr):
n = len(arr)
# Build a maxheap.
for i in range(n//2 - 1, -1, -1):
heapify(arr, n, i)
# One by one extract elements
for i in range(n-1, 0, -1):
arr[i], arr[0] = arr[0], arr[i] # swap
heapify(arr, i, 0)
heap sort
- 建立最大堆(堆顶的元素大于其两个儿子,两个儿子又分别大于它们各自下属的两个儿子… 以此类推)
- 将堆顶的元素和最后一个元素对调(相当于将堆顶元素(最大值)拿走,然后将堆底的那个元素补上它的空缺),然后让那最后一个元素从顶上往下滑到恰当的位置(重新使堆最大化)。
- 重复第2步。
- MacKay也提供了一个修改版的堆排:每次不是将堆底的元素拿到上面去,而是直接比较堆顶(最大)元素的两个儿子,即选出次大的元素。由于这两个儿子之间的大小关系是很不确定的,两者都很大,说不好哪个更大哪个更小,所以这次比较的两个结果就是概率均等的了。具体参考这里。