堆排序详解

本文详细介绍了堆排序的概念和实现过程,包括如何构造大根堆、如何进行堆排序,以及堆与优先队列的关系。堆排序通过构建大根堆,每次取出最大值放到序列末尾,最终完成排序。此外,还讨论了C++ STL中优先队列的使用。
摘要由CSDN通过智能技术生成

上文提到的leetcode第215题除了快速排序的二分partition解法,还可以用堆排序来解决,小小一道medium题居然汇集了快排和堆排这两位卧龙凤雏,实属难得。

数据结构-堆

完全二叉树

首先,堆是一棵完全二叉树,因此其具备完全二叉树的全部特点:

  1. 除了最后一层外,其余层的节点数都达到最大值,而最后一层的节点都集中在左边。
  2. 节点的编号与其对应的满二叉树中节点编号相同
  3. 若最后一个非叶子节点的编号为i,则编号0~i的节点都是非叶子节点,编号i+1~n-1的节点都是叶子节点
  4. 若一个非叶子节点的编号为i,则它的两个子节点的编号分别为2i+12i+2
  5. 对于总节点数为n的完全二叉树,其最后一个非叶子节点的编号为n/2 - 1,原因:最后一个非叶子节点是最后一个叶子节点(编号n - 1)的父亲,根据第4点可得n - 1 = 2i + 1或者n - 1 = 2i + 2,计算取整出来都得到i = n/2 - 1
  6. 根据第3点和第5点,可得第一个叶子节点的编号为n/2

下图中,红色数字即为完全二叉树中节点的编号
在这里插入图片描述

在完全二叉树的基础上,堆还有具有以下性质:每个节点的值都大于等于其左右子节点的值,这是大根堆;每个节点的值都小于等于其左右子节点的值,这是小根堆。
大根堆: a r r [ i ] > = a r r [ 2 i + 1 ]   & &   a r r [ i ] > = a r r [ 2 i + 2 ] arr[i] >= arr[2i+1]\ \&\&\ arr[i]>=arr[2i+2] arr[i]>=arr[2i+1] && arr[i]>=arr[2i

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值