利用基于数组的完全二叉树实现。
如果数组有效下标从1开始,则下标idx的父节点为idx // 2,左孩子结点为idx * 2,右孩子节点为idx * 2 + 1。
如果数组有效下标从0开始,则下标idx的父节点为(idx - 1) // 2,左孩子结点为idx * 2 + 1,右孩子节点为idx * 2 + 2。
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 
 | def heap_make(nums):
 if len(nums) <= 1:
 return
 size = len(nums)
 
 pa = (size - 2) // 2
 while pa >= 0:
 
 down(pa, nums)
 pa -= 1
 
 
 def down(child_tree, nums):
 if not nums:
 return
 value = nums[child_tree]
 size = len(nums)
 idx = child_tree
 while idx < size:
 
 swap_idx = idx * 2 + 1
 
 if swap_idx >= size:
 break
 
 if swap_idx < size - 1 and nums[swap_idx] < nums[swap_idx + 1]:
 swap_idx += 1
 
 if nums[swap_idx] > value:
 nums[idx] = nums[swap_idx]
 idx = swap_idx
 else:
 
 break
 nums[idx] = value
 
 
 def heap_pop(nums):
 
 nums[0], nums[-1] = nums[-1], nums[0]
 rtn = nums.pop()
 
 down(0, nums)
 return rtn
 
 
 def heap_max(nums):
 return nums[0]
 
 
 def heap_push(nums, num):
 nums.append(num)
 idx = len(nums) - 1
 
 pa = (idx - 1) // 2
 value = nums[idx]
 
 while idx > 0 and nums[pa] < value:
 nums[idx] = nums[pa]
 idx = pa
 pa = (idx - 1) // 2
 
 nums[idx] = value
 
 if __name__ == '__main__':
 nums = [1, 4, 3, 7, 0, 6, 9]
 heap_make(nums)
 heap_push(nums, 10)
 heap_push(nums, 12)
 heap_push(nums, 8)
 while nums:
 print(heap_pop(nums))
 
 |