00-1010 Heapsort是指利用堆的数据结构设计的一种排序算法。
堆叠是一种近乎完整的二叉树结构,同时满足堆叠的性质:即子节点的键值或索引始终小于(或大于)其父节点。堆排序可以说是一种利用堆的概念进行排序的选择性排序。
简介
堆:一种特殊的完全二叉树结构根堆:完全二叉树,满足任意节点大于其子节点;一个完整的二叉树,它满足任何节点都小于它的子节点00-1010这里我们用维基的定义来说明:
通常堆是通过一维数组实现的。在阵列开始位置为0的情况下
父节点I的左子节点在位置:(2 * I ^ 1);
父节点I的右子节点在位置:(2 * I ^ 2);
子节点I的父节点在位置:(I-1)//2;
00-1010建桩:将待整理的序列建成桩h [0.n-1],并从最后一个非叶节点开始从左到右、从下到上进行调整。根据上升或下降需求选择大或小的顶桩;此时,堆的顶部元素是最大或最小的元素;交换堆的顶元素和尾元素,调整堆,使堆再次有序;这时,顶部元素是第二大元素;重复以上步骤,直到堆为空。
特点
堆排序节点访问
#####今日头条:技术好奇心
####
#建立维护堆
def heapify(arr,n,i):
#最大位置
最大=i
#左=2*i 1
l=2 * i 1
#右=2*i 2
r=2 * i 2
#比较父节点和左子节点的大小
如果l n和arr[i] arr[l]:
最大=l
#将右边的子节点与当前的大节点值进行比较。
#(可能是父亲,也可能是目前剩下的孩子)
如果r n和arr[最大] arr[r]:
最大=r
#检查上一步得到的最大值是否是上面最初定义的父节点。
#如果不是,交换和递归。
如果最大!=i:
#交易所
arr[i],arr[最大]
#递归调整子树
heapify(arr,n,最大)
#堆排序
def堆排序(arr):
#数组长度
n=len(arr)
#建立一个大的顶堆,从下往上,所以用-1。
对于范围(n,-1,-1):中的I
健康(arr,n,I)
Print(' -构造后数组的内容)
打印(arr)
#逐个交换元素
对于范围(n - 1,0,-1):中的I
#交易所
arr[i],arr[0]=arr[0],arr[i]
#维护交换的堆
heapify(arr,I,0)
if __name__=='__main__':
印刷版(《今日头条:技术好奇心》)
打印('-排序前的数组内容)
arr=[2,7,26,25,19,17,1,90,3,36]
打印(arr)
堆排序(arr)
打印('-排序后的结果)
打印(arr)运行结果:
今日头条:技术好奇心
-排序前数组的内容-。
[2, 7, 26, 25, 19, 17, 1, 90, 3, 36]
-排序后的结果-。
[1, 2, 3, 7, 17, 19, 25, 26, 36, 90]