首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >堆排序没有工作的python

堆排序没有工作的python
EN

Stack Overflow用户
提问于 2016-12-12 09:18:37
回答 1查看 537关注 0票数 0

参照MIT的开放课程软件自选课程第4章,我根据psuedocode创建了堆排序:

代码语言:javascript
复制
def heap_sort(A):
    build_max_heap(A)
    curr_heap_size = len(A)
    while curr_heap_size:
        A[0],A[curr_heap_size-1] = A[curr_heap_size-1],A
        curr_heap_size -= 1
        max_heapify(A,0)
    return A

build_max_heap保证是正确的,因为我用pythons库检查了它。

然而,heap_sort似乎不能正常工作,

代码语言:javascript
复制
test_array = [1,5,3,6,49,2,4,5,6]
heap_sort(test_array)
print(test_array) # --> [6,5,5,4,3,49,6,2,1]

完全困惑在这里,我交叉检查了Heap sort Python implementation和它似乎是一样的.

会很感激你的帮助,谢谢!

编辑: max_heapify和build_max_heap的代码:

代码语言:javascript
复制
def max_heapify(A,i):
    heap_size = len(A)
    l,r = i*2+1,i*2+2
    largest = l
    if l < heap_size and A[l] > A[largest]:
        largest = l
    if r < heap_size and A[r] > A[largest]:
        largest = r
    if largest != i:
        A[i],A[largest] = A[largest],A[i]
        max_heapify(A,largest)

def build_max_heap(A):
    array_size = len(A)
    for i in range(array_size // 2 ,-1,-1):
        max_heapify(A,largest)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-12 10:55:16

您的代码中有几个错误,使得重新生成您的情况变得更加困难,并找到解决您特定问题的方法,但是现在开始了。

首先,您的代码在heap_sort函数中包含一个语法错误,特别是当您试图交换分配的右侧A的第一个和最后一个元素时,第二个值是A,尽管它应该是A。

第二,在build_max_heap中使用变量最大值意味着,最大变量是一个全局变量声明,而您的问题中没有提供它,或者您打算使用i。我认为这是第二种情况,而且由于我有一个基于您提供的代码的工作heap_sort,所以我认为我的假设是正确的。

第三,在max_heapify中,您将最大值初始化为l,即使您应该用i初始化它。我相信您会发现这是一个很小的错误,因为在这个函数的后面,很明显您期望最大的值等于i的值。

最后,您最重要的错误是,您一直在传递整个数组,并使用一个不会减少的数组长度。(即,始终是test_array的初始长度)您使用的算法查找给定数组的最大元素,并将其排除在结构的其余部分之外。这样,您就有了一个数组,该数组的大小不断减小,同时将其最大元素发送到末尾。(即仅超出它的可及范围/长度),但是,由于您从未缩小数组的大小,而且它的长度被连续计算为len(test_array),因此它永远不会像预期的那样工作。

有两种方法可以解决你的问题。选项1将在max_heapify中传递给heap_sort中的一个较短版本的A。具体来说,您应该在循环的每次迭代中传递A:curr_heap_size。此方法可以工作,但并不是真正的空间效率,因为您每次都会创建一个新的列表。相反,您可以将curr_heap_size作为参数传递给函数build_max_heap和max_heapify,并假定这是长度。(即相对于len(A))

下面是一个基于代码的工作heap_sort实现。我所做的就是改正上面列出的错误。

代码语言:javascript
复制
def max_heapify(A, heap_size, i):
    l,r = i*2+1,i*2+2
    largest = i
    if l < heap_size and A[l] > A[largest]:
        largest = l
    if r < heap_size and A[r] > A[largest]:
        largest = r
    if largest != i:
        A[i], A[largest] = A[largest], A[i]
        max_heapify(A, heap_size, largest)

def build_max_heap(A, array_size):
    for i in range(array_size // 2 ,-1,-1):
        max_heapify(A, array_size, i)

def heap_sort(A):
    curr_heap_size = len(A)
    build_max_heap(A, curr_heap_size)
    while curr_heap_size > 0:
        A[0], A[curr_heap_size-1] = A[curr_heap_size-1], A[0]
        curr_heap_size -= 1
        max_heapify(A, curr_heap_size, 0)
    return A
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41097528

复制
相关文章

相似问题

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