堆排序的序列可以看成一棵完全二叉树,完全二叉树比较适合用数组来存储,数组下标从0开始存储,这样的话下标为i节点的左孩子为2i+1,右孩子为2i+2。父节点为i/2。
堆排序代码(python):
def AjustHeap(i,HeapList,LastIndex): # i是父节点
temp = HeapList[i]
j = i * 2 + 1 # 左孩子
while(j <= LastIndex):
if j < LastIndex and HeapList[j] < HeapList[j+1]:
j = j + 1
if temp >= HeapList[j]:
break
else:
HeapList[i] = HeapList[j]
i = j
j = j * 2 + 1
HeapList[i] = temp
"堆排序"
List1 = [101,843,206,156,423,366,624,1200]
ListLen = len(List1)
for i in range((ListLen-2)// 2, -1, -1): # 从最后一个非叶子结点开始
AjustHeap(i,List1,ListLen-1)
'''堆顶与最后一个记录交换位置,并去除后再重新调整'''
for j in range(ListLen-1,0,-1):
List1[0],List1[j] = List1[j],List1[0]
AjustHeap(0,List1,j-1)
List1