首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用python构建最大堆我遇到错误的输出

使用python构建最大堆我遇到错误的输出
EN

Stack Overflow用户
提问于 2020-05-23 21:48:13
回答 1查看 70关注 0票数 0

我正在尝试用python构建最大堆,但是在heapify之后,列表输出不满足最大堆属性。有谁可以帮助解决这个问题吗?

代码语言:javascript
复制
def max_heapify(arr,i):
    left = 2 *i 
    right = 2 * i + 1
    length = len(arr)-1
    largest = i
    if length > left and arr[largest] < arr[left]:
        largest = left
    if length > right and arr[largest] < arr[right]:
        largest = right
    if largest != i:
        arr[largest],arr[i] = arr[i],arr[largest]
        max_heapify(arr,largest)
def build_max_heap(arr):
    for i in reversed(range(len(arr)//2)):
        max_heapify(arr,i)
    return arr

arr = [1,12,9,5,6,10]
print(build_max_heap(arr))

我将输出12,9,6,5,1,10,它不满足最大堆属性

EN

回答 1

Stack Overflow用户

发布于 2020-05-23 22:26:31

有两个问题:

  • 首先,堆是从0开始的(根在索引0处),因此节点0的子节点将是1和2,因此节点i的子节点将是2*i+1 2*i+2
    • 您的代码在交换之前比较了这两个子节点,但它没有将较大的子节点与父节点进行比较,并且仅当子节点大于父节点的

    时才应交换

代码语言:javascript
复制
def max_heapify(arr,i):
    left = 2 *i + 1
    right = 2 * i + 2
    length = len(arr)
    largest = i
    if length > left and arr[largest] < arr[left]:
        largest = left
    if length > right and arr[largest] < arr[right]:
        largest = right
    if arr[largest] > arr[i]:
        arr[largest], arr[i] = arr[i],arr[largest]
        max_heapify(arr,largest)

def build_max_heap(arr):
    N = len(arr)
    for i in reversed(range(len(arr)//2)):
        max_heapify(arr,i)
    return arr

arr = [1,12,9,5,6,10]
print(build_max_heap(arr))

arr = [1,12,9,5,6,10,13]
print(build_max_heap(arr))


output:
[12, 6, 10, 5, 1, 9]                                                                                                                                                               
[13, 12, 10, 5, 6, 1, 9] 
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61972998

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档