【问题标题】:Why does the build_heap function in the heap sort algorithm not execute为什么堆排序算法中的build_heap函数不执行
【发布时间】:2020-03-07 10:09:14
【问题描述】:

以下用于实现堆排序算法以及 max_heapify 和 build_heap 函数的 python 代码导致以下错误消息:

Traceback (most recent call last):
  File "heap.py", line 30, in <module>
    build_heap(arr)
  File "heap.py", line 25, in build_heap
    for i in range(((int(len(array))-1)/2),0,-1):
TypeError: 'float' object cannot be interpreted as an integer

还有代码:

def left(i):
    return(2*i)
def right(i):
    return(2*i+1)
def max_heapify(array,i,heap_size):
    l=left(i)
    r=right(i)
    largest=i
    if(l<=heap_size and array[l]>array[i]):
        largest=l
    elif(r<=heap_size and array[r]>array[i]):
        largest=r
    if(largest!=i):
        swap(array,i,largest)
        max_heapify(array,largest)




def swap(array,a,b):
    array[a],array[b]=array[b],array[a]

def build_heap(array):
    heap_size=len(array)-1
    for i in range(((int(len(array))-1)/2),0,-1):
        max_heapify(array,i,heap_size)


arr=[0,10,9,8,7,6,5,4,3,2,1,0]
build_heap(arr)
print(arr)


【问题讨论】:

  • 当这是整数除法时,这可能是 Python-2.x 中所写的。

标签: python-3.x algorithm sorting heap heapsort


【解决方案1】:

int(len(array) - 1) / 2 是一个浮点数,因为你在 转换为整数之后除以 2。只需执行(len(array) - 1) // 2,它将给出一个整数。

您还应该为列表的第一个元素调用 max_heapify - 因此考虑到这两个更改,您的循环需要为 for i in range((len(array)-1)//2, -1, -1)

(我假设这只是一个错字,但是当您从内部调用 max_heapify 时,您只传递了两个参数,您需要添加 heap_size)。

【讨论】:

  • arr=[0,0,1,2,3,4,5,6,7,8,9,10] build_heap(arr) print(arr) 这段代码给出了这个输出[0, 7, 3, 5, 1, 9, 2, 6, 0, 8, 4, 10] 为什么算法没有给出最大有序堆?
【解决方案2】:

这很可能是用 写的。如果您将 中的两个整数相除,则执行整数除法。在 中,您可以使用//(同样适用于):

def build_heap(array):
    heap_size=len(array)-1
    for i in range(heap_size//2, -1, -1):
        max_heapify(array,i,heap_size)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-20
    • 2017-08-12
    • 1970-01-01
    相关资源
    最近更新 更多