python - 基于数组的 MinHeap
问题描述
我正在尝试实现一个将列表转换为 MinHeap 的函数。我看不出哪里出错了。
def min_heapify(nums):
n = len(nums) - 1
i = n // 2 # last parent
while i >= 1:
k = i
v = nums[k]
min_heap = False
while not min_heap and 2 * k <= n:
j = 2 * k
if j + 1 <= n:
if nums[j + 1] < nums[j]:
j += 1
if nums[k] < nums[j]:
min_heap = True
else:
nums[k] = nums[j]
k = j
nums[k] = v
i -= 1
示例输入:
a_list = [0, 5, 2, 3, 4]
min_heapify(a_list)
输出(4 不正确):
print("Min Heapify", a_list) # Min Heapify [0, 2, 5, 3, 4]
解决方案
我认为你应该交换num[j]
and num[k]
,你刚刚分配的地方nums[k] = nums[j]
:
def min_heapify(nums):
n = len(nums) - 1
i = n // 2 # last parent
while i >= 1:
k = i
v = nums[k]
min_heap = False
while not min_heap and 2 * k <= n:
j = 2 * k
if j + 1 <= n:
if nums[j + 1] < nums[j]:
j += 1
if nums[k] < nums[j]:
min_heap = True
else:
# HERE: Need to swap num[j] and num[k]
[nums[j], nums[k]] = [nums[k], nums[j]]
k = j
nums[k] = v
i -= 1
a_list = [0, 11, 5, 2, 3, 4, 7, 17, 6, 1]
min_heapify(a_list)
print(a_list)
# prints: [0, 1, 3, 2, 5, 4, 7, 17, 6, 11]
推荐阅读
- java - 如何让随机生成的对象出现在我的屏幕上?
- html - 将不同的类型和大小组合在一个
- ios - Cocoapods 'Charts' 安装问题
- c++ - std::tuple 中的大型固定大小数组耗尽了 MSVC 中的编译器堆?
- python - 在 Mayavi (Python) 中用不同颜色绘制 3D 点
- objective-c - 如何将 swift 控制器中的参数传递给目标 c 模型?
- reporting-services - 如何对一行数据进行简单的 SSRS 表示?
- javascript - 如何使用Windows认证连接Sql express?
- c# - 在 C# 中使用带有数组的 if else 语句
- smtp - PHPMailer 和谷歌 SMTP 中继。收件人收到其他客户电子邮件的重复电子邮件过多