# 堆调整函数defheapify(arr, n, i):# 坐标关系
largest = i # 根节点
l =2* i +1# left = 2*i + 1 左叶子结点
r =2* i +2# right = 2*i + 2 右叶子结点if l < n and arr[i]< arr[l]:# 根结点和左结点比较得到最大值索引
largest = l
if r < n and arr[largest]< arr[r]:# 最大值索引和右结点比较得到新的最大值索引
largest = r
if largest != i:# 最大值索引不是根节点(重新向下构建)
arr[i],arr[largest]= arr[largest],arr[i]# 交换
heapify(arr, n, largest)# 继续顺着交换之后的结点向下调整defheapSort(arr):# 堆排序和堆调整
n =len(arr)# 形成大根堆for i inrange(n-1,-1,-1):# 根据列表当中的数,从无到有建立(先从叶子结点开始,自底向上建立)
heapify(arr, n, i)# 此时列表中存放的是一个大根堆# 一个个交换元素 for i inrange(n-1,0,-1):# 列表中的数从右到左开始调整
arr[i], arr[0]= arr[0], arr[i]# (将最后一层最右侧的结点和根结点进行交换)
heapify(arr, i,0)# 重新进行大根堆的调整,调整之后arr[0]中会变成符合大根堆的值
arr =[12,11,13,5,6,7]
heapSort(arr)
n =len(arr)print("排序后")for i inrange(n):print("%d"%arr[i])
008.排序算法——(二)选择排序——堆排序1.算法思想升序,建立大根堆降序,建立小根堆数据利用列表存储步骤:升序,建立大根堆建立完成后,利用大根堆的结构,交换根结点和最下层最右侧的结点,最终形成升序序列2.算法代码# 堆调整函数def heapify(arr, n, i): # 坐标关系 largest = i # 根节点 l = 2 * i + 1 # left = 2*i + 1 左叶子结点 r = 2 * i + 2