max_heapify 是用于维护最大堆性质的重要过程,如果父节点 A[i] 小于其左右孩子,就违背了最大堆的性质。max_heapify 通过让 A[i] 的值在最大堆中逐级下降,从而使得以下标 i 为根节点的子树重新遵循最大堆的性质。
伪代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
max_heapify(A, i) lChild = left(i) rChild = right(i) # 如果左孩子比父节点大 if lChild <= A.heap_size and A[lChild] > A[i] largest = lChild else largest = i # 如果右孩子比左孩子 或 父节点大 if rChild <= A.heap_size and A[rChild] > A[largest] largest = rChild # 最大节点不是父节点,要逐级下降 if largest != i swap(A[i], A[largest]) max_heapify(A, largest)
voidswap(MaxHeap heap, int i, int j) { inttmp= heap.A[i]; heap.A[i] = heap.A[j]; heap.A[j] = tmp; }
voidmaxHeapify(MaxHeap heap, int i) { intlChild= heap.left(i); intrChild= heap.right(i); intlagest= i; if (lChild <= heap.heapSize && heap.A[lChild] > heap.A[i]) { lagest = lChild; } if (rChild <= heap.heapSize && heap.A[rChild] > heap.A[lagest]) { lagest = rChild; } if (lagest != i) { swap(heap, i, lagest); maxHeapify(heap, lagest); } }
MaxHeap buildMaxHeap(int[] A) { MaxHeapheap=newMaxHeap(A); for (inti= heap.length / 2; i >= 0; i--) { maxHeapify(heap, i); } return heap; }
int[] heapSort(int[] A) { MaxHeapheap= buildMaxHeap(A); for (inti= heap.heapSize; i >= 1; i--) { swap(heap, 0, i); heap.heapSize--; maxHeapify(heap, 0); } return heap.A; }
优先队列
优先队列(priority queue)是一种用来维护由一组元素构成的集合 S 的数据结构,其中的每一个元素都有一个相关的值,称为关键字(key)。
一个最大优先队列支持以下操作: insert(S, x):把元素插入集合 S 中(等价于 S = S U {x})。 max(S):返回 S 中具有最大关键字的元素。 extract_max(S):去掉并返回 S 中的具有最大关键字的元素。 increase_key(S, x, k):将元素 x 的关键字值增加到 k,这里假设 k 的值不小于 x 的原关键字值。