堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。
堆是一种类似于完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或者索引总是大于(小于)它的父节点。
二叉树的遍历
树的遍历:对树中所有元素不重复的访问一遍,也称作扫描。
遍历树的方式:
- 广度优先遍历
- 层序遍历
- 深度优先遍历
- 前序遍历
- 中序遍历
- 后序遍历
堆排序
- 堆是一个完全二叉树
- 每个非叶子结点都要大于或者等于其左右孩子结点的值的堆称为大顶堆
- 每个非叶子结点都要小于或者等于其左右孩子结点的值的堆称为小顶堆
- 根节点一定是大顶堆的最大值或者小顶堆的最小值
堆排序的实现:
堆排序可以按以下步骤来完成:
1.先构建大顶堆
为了更直观的看到大顶堆的实现过程,我们可以实现将一个数组先打印成一个二叉树的格式
def print_tree(src):
length = len(src)
k = math.ceil(math.log2(length+1))
index = 1
max_width = 2 * length
for i in range(k): # 0,1,2
for j in range(2**i):
print("{:^{}}".format(src[index],max_width),end = " ")
index += 1
if index >= length:
break
max_width = max_width // 2
print( )
src = [0,9,8,7,6,5,4,3,2,1]
print_tree(src)
9
8 7
6 5 4 3