算法导论——小顶堆性质维护测试(python示例)

# utf-8=coding
import math
# 算法导论课本        小顶堆程序  代码示例
# 小顶堆程序


# 维护小顶堆性质
def min_heapify(A, i):
    heap_size = A[0]
    left = 2 * i
    right = 2 * i + 1
    min = i
    if left <= heap_size and A[left] < A[i]:
        min = left
    if right <= heap_size and A[right] < A[min]:
        min = right
    if min != i:
        temp = A[min]
        A[min] = A[i]
        A[i] = temp
        min_heapify(A, min)


# 建小顶堆
def build_min_heap(A):
    mid_num = math.floor(len(A) / 2)
    for i in range(mid_num, 0, -1):
        min_heapify(A, i)


# 堆排序
def heap_sort(A):
    for i in range(len(A) - 1, 1, -1):
        temp = A[1]
        A[1] = A[i]
        A[i] = temp
        A[0] -= 1
        min_heapify(A, 1)


# 返回最小元素值(即堆顶元素),继续保持小顶堆性质
def heap_extract_min(A):
    if A[0] < 1:
        print("堆为空!!!")
        return 0
    min = A[1]
    # 把最后一个元素值 赋值给 A[1]
    A[1] = A[A[0]]
    # 删除最后一个元素
    del A[A[0]]
    print("删除最后一个元素后,A数组为", A)
    A[0] -= 1
    min_heapify(A, 1)
    return min


# 插入一个小于 0 的元素后  保持小顶堆性质
def min_heap_insert(A, key):
    A[0] += 1
    A.append(0)
    if A[A[0]] < key:
        A[A[0]] = key
        # 父节点 和  A[A[0]](插入的值) 作比较
        i = A[0]
        while i > 1 and A[math.floor(i / 2)] > A[i]:
            temp = A[math.floor(i / 2)]
            A[math.floor(i / 2)] = A[i]
            A[i] = temp
            i = math.floor(i / 2)


# for i in range(10, 0, -1):
#    print(i)
# print(math.floor(10.2))
# 数组下标从 0 开始 填充0,第0个下标元素 不参与堆运算
A = [0, 16, 4, 10, 14, 7, 9, 3, 2, 8, 1, ]
# A[0] 存堆元素个数
A[0] = len(A) - 1
build_min_heap(A)
print("小顶堆", A)
# 排序
# heap_sort(A)
# A[0] = len(A) - 1
# print("排序后的小顶堆(第一个元素为堆元素个数):", A)
# 取出堆顶元素,并使其继续保持小顶堆性质
for i in range(0, 5):
    print("取出最小元素:", heap_extract_min(A))
    print("剩余小顶堆为(第一个元素为堆元素个数):", A)
# 插入元素后  保持小顶堆性质
min_heap_insert(A, 8)
print("插入8后的小顶堆", A)
min_heap_insert(A, 50)
print("插入50后的小顶堆", A)

转载于:https://my.oschina.net/xiaohuoer1995/blog/1600225

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值