堆排序图文详解

一、堆的定义

堆可以定义为一课二叉树,树的节点中包含一个值,并且满足下面两个条件:

  1. 树要求是一棵完全二叉树;
  2. 树具有父母优势,即父节点比子节点值要大(小根堆相反);

在这里插入图片描述

左边的是大根堆,右边的不属于堆

根据以上堆的两个特性,不难看出在堆中,值是从上到下排序的即从任何一个根节点出发到达叶子节点的值是递增 (递减) 的 (假设堆中不存在相等的元素)。但是,值得注意的是,在同一层次的元素中,他们的是没有任何的直接关系。

由于堆是一棵二叉树,所以堆具有以下特性:(默认大根堆)

  1. n个节点的二叉树的高度为 ()下取整;在这里插入图片描述

  2. 根的值总是大于其子节点的值;

  3. 任意一棵子树都是堆;

  4. 堆可以映射为数组表示:

根据二叉树的层序遍历,把元素依次存放入数组,此时有两种储存方式,第一种是从下标1开始存放:

在这里插入图片描述

当从下标1开始存放的时候:

  1. 其父节点是 :i / 2(下取整);
  2. 左孩子:2 * i;
  3. 右孩子:2 * i + 1;

第二种是从下标为0开始存放:

在这里插入图片描述

当从下标0开始存放的时候:

  1. 其父节点是 :(i-1) / 2(下取整);
  2. 左孩子:2 * i + 1;
  3. 右孩子:2 * i + 2;

所以说,大根堆中满足 父节点 大于 左/右孩子节点;小根堆中满足 父节点 小于 左/右孩子节点;

二、堆的构造

给出一个无序的数组[1,5,3,4,2],将其构造成一个大根堆的步骤:

  1. 从左到右依次遍历,对每一个元素都与其父节点 (i-1)/2 比较;
  2. 如果大于父节点,则交换位置,继续与交换后的位置的父节点比较,直到小于父节点;

构造堆之前:

在这里插入图片描述

首先是下标 0 的元素,由于其没有父节点,所以不用与父节点比较:(蓝色的是有序)

在这里插入图片描述

下标 1 的元素,与它的父节点 0 比较,大于父节点,则与其父节点交换,交换后的节点没有父节点,所以不用比较:

在这里插入图片描述

下标 2 的元素,与父节点 0 比较,小于父节点,不用交换:

在这里插入图片描述

下标 3 的元素,与父节点 1 比较,大于父节点,则交换;交换后下标 1 的元素与父节点 0 比较,小于父节点,不用交换:

在这里插入图片描述

下标 4 的元素,与父节点 1 比较,小于,不用交换:

在这里插入图片描述

此时,已经构建好了一个大根堆,满足两个条件:完全二叉树和父母优势。

在这里插入图片描述

三、堆排序

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值