堆排序算法理解:
用列表表示堆积,父节点i,子节点2i+1、2i+2,第一步先从最后一个父节点开始遍历一遍,二叉树基本有序,此时根节点为最大值,最后一个子节点为最小值,交换根节点和最小子节点,交换过去的根节点(当时的最大值)不再参与遍历,之后再依次从根节点开始遍历找出最大值(根节点)和最小值(最后一个子节点),交换根节点和最小子节点,交换过去的根节点(当时的最大值)不再参与遍历,重复此步骤直到不再有可遍历的子节点。
#置为大顶堆
def max_heap(cards,start,end):
dad=start
son=dad*2+1
while son<=end:
if son+1<=end and cards[son]<cards[son+1]:
son+=1
if cards[dad]>cards[son]:
return
else:
cards[dad],cards[son]=cards[son],cards[dad]
dad=son
son=dad*2+1
#堆排序
def heap_sort(cards):
for i in range(len(cards)//2-1,-1,-1):
max_heap(cards,i,len(cards)-1)
for i in range(len(cards)-1,0,-1):
cards[0],cards[i]=cards[i],cards[0]
max_heap(cards,0,i-1)
print(cards)
cards=[5,3,9,1,8,6]
heap_sort(cards)