-
建立堆。
-
得到堆顶元素,为最大元素。
-
去掉堆顶元素,将堆最后一个元素放到堆顶,此时可通过一次调整重新使堆有序。
-
堆顶元素为第二大元素。
-
重复步骤3,直到堆变空。
代码实现
def sift(li,low,high): # 下调函数的实现
"""
下调函数的实现
:param li:列表
:param low: 堆的根节点的位置
:param high:堆的最后一个元素位置
:return:
"""
i = low # i开始指向根节点
j = 2 * i + 1 # j开始是左孩子
tmp = li[low] # 把堆顶存起来
while j <= high: # 只要j位置有数
if j + 1 <= high and li[j+1] > li[j]: # 如果右孩子存在且数值较大
j = j + 1 # j指向右孩子
if li[j] > tmp:
li[i] = li[j]
i = j # 往下看一层
j = 2 * i + 1
else: # tmp更大,把tmp放到i的位置上
li[i] = tmp # 把tmp放到某个父节点中
break
else:
li[i] = tmp # 将tmp放到叶子节点上
def heap_sort(li):
# 1. 构造堆
n = len(li)
for i in range((n-2)//2, -1, -1):
# i表示建堆的时候调整的部分根的下标
sift(li,i,n-1) # n-1表示high
# 建堆完成
for i in range(n-1,-1,-1):
# i 指向当前堆的最后一个元素
li[0],li[i] = li[i],li[0]
sift(li,0,i-1) # i-1是新的high
li = [0,2,1,4,3,6,5,9,8,7]
heap_sort(li)
print(li)
-
堆排序的时间复杂度:O(nlogn)