JavaScript算法——堆排序

本文详细介绍了堆排序的概念,包括大顶堆和小顶堆的定义,以及完全二叉树的特性。堆排序的过程分为初始化大顶堆、交换根节点与末尾节点并重新调整堆等步骤。通过动图演示和JS代码实现,帮助读者理解堆排序的逻辑。最后,文章提供了辅助理解案例,逐步解析排序过程。
摘要由CSDN通过智能技术生成

一、知识准备

**首先是堆的概念。**这里的堆其实可以简单的理解成金字塔形的形象体。我们用二叉树来构造,但是我们这个二叉树是完全体,也就是树的扩展是要有顺序排列的。

  • 堆是一个完全二叉树。
  • 完全二叉树: 二叉树除开最后一层,其他层结点数都达到最大,最后一层的所有结点都集中在左边(左边结点排列满的情况下,右边才能缺失结点)。
  • 大顶堆:根结点为最大值,每个结点的值大于或等于其孩子结点的值。
  • 小顶堆:根结点为最小值,每个结点的值小于或等于其孩子结点的值。
  • 堆的存储: 堆由数组来实现,相当于对二叉树做层序遍历。

大堆顶:
在这里插入图片描述
小堆顶:
在这里插入图片描述

二、排序思路

  • 将初始二叉树转化为大顶堆(heapify)(实质是从第一个非叶子结点开始,从下至上,从右至左,对每一个非叶子结点做heapify操作),此时根结点为最大值,将其与最后一个结点交换。
  • 除开最后一个结点,将其余节点组成的新堆转化为大顶堆(实质上是对根节点做heapify操作),此时根结点为次最大值,将其与最后一个
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值