最大/最小堆排序和反向堆排序

时间:2020-03-16 18:50:36

标签: algorithm sorting heap heapsort

我只想检查一下我是否理解教授和在线资源所说的话。

对于heapSort算法,第一个元素的索引从0开始。

对于最大堆,如果子对象大于父对象,则percolate down应该将最大子对象与其父对象交换,所以类似(这是分配的,因此我尝试发布尽可能少的代码):

def percolateDownMaxHeap( array, hole, length):
    while hole * 2 < size - 1:
        left = 2*hole + 1
        right = left + 1

        max = left

        if (left < size - 1) and (array[right] > array[left]):
            max = right

        if (array[max] > array[hole]):
            swap(array, hole, max)

        else:
            break

        hole = max

因此,最后,最大元素应位于索引0。

如果这是正确的,我不理解的是heapSort实现:

def heapSort(array):
    i = len(array) / 2
    while i >= 0:
        percolateDownMaxHeap( array, i, len(array))
        i -= 1

    i = len(array) - 1

    while i > 0:
        swap( array, 0, i );
        percolateDownMaxHeap( array, i, len(array))
        i -= 1

不是在应该将最大元素放在索引0的最大堆中向下渗透吗?在这种情况下,为什么不对最小堆使用percolate呢?该代码有效,但是我不确定是否正确,还是实现了最大堆而不是最小堆

谢谢

1 个答案:

答案 0 :(得分:2)

不是在应该将最大元素放在索引0的最大堆中向下渗透吗?

是的。然后,您的代码将其交换通过堆,因此每次后续交换都将其所属的下一个最大元素放置在那里。

在这种情况下,为什么不在最小堆上使用渗滤呢?

那将使min元素处于正确的位置,但是堆仍然需要在数组中的该位置,因此不清楚对下一个元素做什么。