二叉堆
二叉堆本质上是一种完全二叉树。堆的插入和删除操作,时间复杂度是O(logn),构建的复杂的是O(n)。
二叉堆的存储方式为顺序存储,所有结点都存储在数组中
def up_adjust(array=[]):
'''
二叉堆尾结点上浮操作
:param array: 原数组
:return:
'''
child_index = len(array)-1
parent_index = (child_index-1)//2
temp = array[child_index]#保存插入叶子结点的值,用于最后赋值
while child_index >0 and temp < array[parent_index]:
array[child_index] = array[parent_index]
child_index = parent_index
parent_index = (parent_index-1)//2
array[child_index] = temp
def down_adjust(parent_index, length, array=[]):
'''
二叉堆结点下沉操作,最终每一个孩子都小于它的左右孩子
:param parent_index: 带下沉结点下标
:param length: 堆的长度范围
:param array: 原数组
:return:
'''
temp = array[parent_index]
child_index = 2*parent_index+1
while child_index<length:
#如果有右孩子,且右孩子的值小于左孩子的值,则定位到右孩子
if child_index + 1 < length and array[child_index+1] < array[child_index]:
child_index += 1
#如果父节点的值小于任何一个孩子的值,跳出
if temp <= array[child_index]:
break
array[parent_index] = array[child_index]
parent_index = child_index
child_index = 2 * child_index + 1
array[parent_index] = temp
def build_heap(array=[]):
'''
构建二叉堆
:param array: 原数组
:return:
'''
#从最后一个非叶子结点开始,依次下沉调整
for i in range(len(array)-2 // 2, -1 ,-1):
down_adjust(i,len(array),array)
print(array)
if __name__ == '__main__':
#二叉堆可用于堆排序及优先队列
my_array = [1,3,2,6,5,7,8,9,4]
up_adjust(my_array)
print(my_array)
my_array = [7,1,3,10,5,2,8,9,6]
build_heap(my_array)
参考:《漫画算法》