heapify函数不提供排序列表

时间:2019-07-19 06:07:54

标签: heap python-3.7

heapify如何工作? 我试图找到使用堆的中位数。 heapify给我一种排序的方式 当我使用heapq.heappush()添加元素时,将其插入到列表中。 当我再次调用heapify时,返回的列表未列出。

import heapq

l=[5,15,1,3]

heapq.heapify(l)

print(l)

这给了我[1, 3, 5, 15]

但是当我添加heapq.heappush(l,2)时 它返回

[1, 2, 5, 15, 3]

当我再次进行heapq.heapify(l)

还是,它给了我相同的东西。

[1, 2, 5, 15, 3]

如何使用堆来找到中位数?列表应该排序吗?

2 个答案:

答案 0 :(得分:1)

如果您查看theory section of heapq,则会发现它没有对列表进行排序。但这会将它们置于带有奇怪的不变变量的中:

lst[k] <= lst[2*k+1] and lst[k] <= lst[2*k+2]

您的列表很满意;如果您以“二叉树”形式查看它:

      1
  2       5
15  3

2小于153。满足条件。将5与不存在的元素(被认为是无限的-因此条件成立)进行比较。


为了对列表进行排序,最好使用sorted

lst = sorted(lst)
# [1, 3, 5, 15]

然后有效地 在已排序的列表中插入bisect模块:

from bisect import insort_left
insort_left(lst, 2)
# [1, 2, 3, 5, 15]

中位数现在为lst[len(lst)//2]

print(f"median = {lst[len(lst)//2]}")
# median = 3

或者,根据您的约定(这里是statistics.median中使用的约定):

def median(lst):
    ln = len(lst)
    if ln % 2 != 0:
        return lst[ln // 2]
    else:
        return (lst[ln // 2 - 1] + lst[ln // 2]) / 2

答案 1 :(得分:-2)

如果您希望在每次添加元素后都进行排序,请尝试将这些元素添加到列表中(附加它们)。然后像您一样堆放列表。它将每次给您排序列表。 :-)