# 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