python堆序算法
1.堆序排序的核心是要先建立堆 然后进行调整
堆的特点 任意子节点都比父节点小
2.调整 把最后一个元素和堆顶进行对比 如果大就保留
代码
'''
1.线建立一个堆
'''
def sift(data,low,hight): #low循环的节点 hight 总长度
i = low
j = 2*i +1
tmp = data[i] #把当前节点值记录下来
while j < hight: #子节点在总长度里面
if j+1<=hight and data[j] < data[j+1]: #如果这个节点有右节点 而且右节点值比左节点大
j +=1 #下标换成右侧节点值的下标 这个时候data[j]就是右侧大的数了
if data[j] > tmp : #如果走了上一步 那就是右侧的值 如果没走那就是左侧孩子的值
data[i] = data[j] #把大的值暂时放到 i这个节点上
i = j
j = 2 *i + 1 #再次循环这个节点的字节点
else:
break
data[i] = tmp #把循环的最后一个节点放到data[i]上去
def heap_sort(data):
n = len(data)
for i in range(n//2 -1, -1, -1,-1); #组成二叉树 拆一半 每个节点进行循环
sift(data,i,n-1) # 进行堆的构建 这一步构建以后 满足堆的定义 任意子节点比父节点小
for i in range(n-1,-1,-1): #建堆完事以后 进行调整 最大的数放在最后
data[0], data[i] = data[i], data[0]
sift(data,0,i-1)
L = [1,7,2,45,87,23,46,76,99,38]
heap_sort(L)
print(L) #建堆后 得到的数列为 [99, 87, 46, 76, 38, 23, 2, 7, 45, 1]
####最后排序结果为 [1, 2, 7, 23, 38, 45, 46, 76, 87, 99]