Java 如何";heapify“;移除最小值后基于数组的最小值堆?

Java 如何";heapify“;移除最小值后基于数组的最小值堆?,java,arrays,heap,min-heap,Java,Arrays,Heap,Min Heap,调用remove min函数后,我如何在java中“heapify”一个基于数组的最小堆(这只是获取索引1处的元素并将其删除,然后用数组中的最后一项替换它)。在remove min发生后,我不知道如何将数组再次放入最小堆中 在堆最小数组中,索引0始终保持为空。父索引为i/2,右子索引为2i+1,左子索引为2i 任何帮助都将不胜感激,谢谢各位 获取最后一个元素并将其复制到第一个位置。将heapsize减少1,并对第一个元素调用heapify()。堆应该自行修复。其复杂性为O(logn) Min H

调用remove min函数后,我如何在java中“heapify”一个基于数组的最小堆(这只是获取索引1处的元素并将其删除,然后用数组中的最后一项替换它)。在remove min发生后,我不知道如何将数组再次放入最小堆中

在堆最小数组中,索引0始终保持为空。父索引为i/2,右子索引为2i+1,左子索引为2i


任何帮助都将不胜感激,谢谢各位

获取最后一个元素并将其复制到第一个位置。将heapsize减少1,并对第一个元素调用
heapify()
。堆应该自行修复。其复杂性为O(logn)

Min Heapify Down(数组A,int i):
左边← 2i
正确的← 2i+1
最小的← 我
如果留下≤ 堆长[A]和[left]
但是heapify代码会是什么样子呢?它与构建堆时使用的heapify()是一样的。问题是,我在构建堆时使用的heapify使用父元素作为比较器,因此我将如何比较新的index 1元素,因为它没有父元素。这就是让我困惑的地方。@Vimzy听起来你需要看看“heapify up”和“heapify down”过程之间的区别。正如@Sneftel提到的,您需要使用heapify-down。维基百科文章中的代码是针对max heap的。您只需要修改它就可以在最小堆上工作。
Min-Heapify-Down (Array A, int i):
    left ← 2i
    right ← 2i + 1
    smallest ← i

    if left ≤ heap_length[A] and A[left] < A[smallest] then:
        smallest ← left
    if right ≤ heap_length[A] and A[right] < A[smallest] then:
        smallest ← right

    if smallest ≠ i then:
        swap A[i] ↔ A[smallest]
        Min-Heapify-Down(A, smallest)