【C++】【排序】堆排序

本文介绍了堆排序的基础知识,包括树的理解、根与孩子结点的序号关系、大顶堆与小顶堆的概念。堆排序的具体过程分为创建堆、交换堆顶与最后一个元素并重新调整为大顶堆两步。文中还给出了重整为大顶堆和堆排序的代码实现,强调了在比较和递归过程中需要注意的细节。
摘要由CSDN通过智能技术生成

图片来源于菜鸟教程,还有讲解:链接
在这里插入图片描述

1 基础知识

1)树的新理解方法:

  (非空树)一棵树有一个根,其余结点又可以划分为不同的集合,每一个集合又是一棵树,并且称为根的子树。

  在完全二叉树中,由于每个结点最多有两个孩子结点,因此完整的最小的一棵子树是由三个结点构成。也就是说,根与两个孩子构成一棵树,而其两个孩子作为根也可以构成一棵树,整颗大树是由一棵棵小树构成
详细定义见<大话数据结构>P151

2)树中根与孩子结点间序号关系:
  • 总根index=1:
    在这里插入图片描述

  在有的教材中对树的标记从index=1开始,可能是有的数组index=0的元素存储的是长度?此时根与孩子结点的序号关系:

root:index
left_child: left
right_child:right

//由根到左右孩子:
left = index * 2
right = index * 2 + 1

//由左右孩子到根:
index = left/2 = right/2 (整除)
  • 总根 index=0:
    在这里插入图片描述
      终于找到一张从index=0标记的图,这个与实际存储相同。此时根与孩子结点的序号关系:
root:index
left_child: left
right_child:right

//由根到左右孩子:
left = index * 2 + 1
right = index * 2 + 2

//由左右孩子到根:
index = (left-1)/2 = (right-1)/2(整除)
3)堆以及大顶堆、小顶堆:
  • 堆是一个完全二叉树,其中的元素按照层序遍历的方式排列。
  • 大顶堆:堆中每个结点的值都大于等于其左右孩子结点的值,称为大顶堆。
  • 小顶堆:堆中每个结点的值都小于等于其左右孩子结点的值,称为大顶堆。
    <大话数据结构>P397
4)理解 i<size
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值