0
点赞
收藏
分享

微信扫一扫

堆操作及堆排序


文章目录

  • ​​堆操作​​
  • ​​堆排序​​

堆操作

def heap_insert(lis,index):
while lis[index] > lis[int((index-1) / 2)]: # 当前节点大于父节点
lis[index],lis[int((index-1) / 2)] = lis[int((index-1) / 2)], lis[index]
index = int((index-1) / 2)
def heapify(lis,index,size):
'''
lis:操作的数组
index:当前元素的索引
size:所要堆化元素的最大下标
'''
left = index * 2 + 1 # 左孩子下标
while(left < size):
# 当前元素两个儿子最大的索引
largest = left+1 if (left + 1) < size and lis[left] < lis[left+1] else left
# 最大儿子索引和父亲索引取最大值
largest = largest if lis[largest] > lis[index] else index

if largest == index: # 当前仍然是大根堆
break


lis[index],lis[largest] = lis[largest], lis[index]
index = largest
left = index * 2 + 1

堆排序

def heapify(lis,index,size):
'''
lis:操作的数组
index:当前元素的索引
size:所要堆化元素的最大下标
'''
left = index * 2 + 1 # 左孩子下标
while(left < size):
# 当前元素两个儿子最大的索引
largest = left+1 if (left + 1) < size and lis[left] < lis[left+1] else left
# 最大儿子索引和父亲索引取最大值
largest = largest if lis[largest] > lis[index] else index

if largest == index: # 当前仍然是大根堆
break


lis[index],lis[largest] = lis[largest], lis[index]
index = largest
left = index * 2 + 1

def heap_insert(lis,index):
while lis[index] > lis[int((index-1) / 2)]: # 当前节点大于父节点
lis[index],lis[int((index-1) / 2)] = lis[int((index-1) / 2)], lis[index]
index = int((index-1) / 2)


def heap_sort(lis):
if len(lis) < 2:
return
# for i in range(len(lis)):
# heap_insert(lis,i)
for i in range(len(lis)-1,-1,-1):
heapify(lis,i,len(lis))
size = len(lis) - 1
lis[0],lis[size] = lis[size],lis[0]
print(lis)
while(size > 0):
heapify(lis,0,size)
print(lis)
size -= 1
lis[0],lis[size] = lis[size],lis[0]

return lis
lis = [2,1,3,0,0,5,7]
print(heap_sort(lis))


举报

相关推荐

0 条评论