【问题标题】:heap sort and reverse heap sort with max/min heap使用最大/最小堆进行堆排序和反向堆排序
【发布时间】:2020-06-27 21:37:33
【问题描述】:

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

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

对于最大堆,如果子级大于父级,则向下渗透应该将最大子级与其父级交换,例如(这是用于分配,因此我尝试发布尽可能少的代码):

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 down 呢?该代码有效,但我不确定我是否正确,或者我是否实现了最大堆而不是最小堆

谢谢

【问题讨论】:

    标签: algorithm sorting heap heapsort


    【解决方案1】:

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

    确实如此。然后您的代码将其交换通过堆,因此每次连续交换都会将下一个最大元素放置在它所属的位置。

    在这种情况下,为什么不在最小堆上使用 percolate down?

    这将使 min 元素处于正确的位置,但堆仍然需要数组中的那个位置,所以不清楚如何处理下一个元素。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-07
      • 2015-08-02
      • 2018-07-10
      • 1970-01-01
      • 2020-09-18
      • 2020-12-04
      相关资源
      最近更新 更多