Java数据结构与Java算法学习Day06---堆(简略笔记记录)

目录

一、堆 96

1.1堆的定义 96 

1.2堆的API设计 97

1.3堆---堆的插入方法 98

1.4堆---堆的删除最大元素方法 99

1.5堆---堆的测试 100

二、堆排序 101

2.1堆排序  101


一、堆 96

1.1堆的定义 96 

堆实际上也是利用数据结构实现的,用树实现的特殊结构,也是树的一种。

堆的特性:

特性1, 堆:完全二叉树

 

特性2,通过数组实现完全二叉树的表达:(利用数组来实现堆的这个二叉树)

下面的图就是表现的是上面完全二叉树的形式。

 

注:

1、已知结点的索引位置,便可知道其父结点和其两个子节点的索引位置。前提是完全二叉树

如果一个结点的位置为k,则它的父结点的位置为(k/2),它的子结点的位置为2k和(2k+1)。

例如:结点p,则其父结点索引位置为2,子结点的位置为8和9

2、根据索引的位置变换,实现结点层数的变化。

向上移动一层,就将k值变为原来的一半即k/2,如果想向下移动一层,就将k值变为原来的二倍(2k)或者二倍基础上再加1(2k+1)。

特性3,同一个结点下的两个子节点没有大小区分。

父结点的值要比其两个子结点的值大。 

二叉查找树:左子结点小于右子结点。.

堆:左子结点和右子结点之间没有大小区分。

1.2堆的API设计 97

这个地方错误,修改为:Heap<T extends Comparable<T>>

根据特性3,可以知道这个堆是个有序的树,索引需要这个Comparable<T>,来提供比较规则

本部分代码的实现在/heap/Heap中

1.3堆---堆的插入方法 98

堆的插入方法的实现的原理见文档P4。

1.4堆---堆的删除最大元素方法 99

最大元素:实际上就是堆的第一个值,即根结点就是最大的元素

根结点的删除的原理图请查看文档P6。

其中最不好处理的问题是:删除掉最大元素后,谁来替换最大元素的位置呢?

第一步:

虽然堆的特性是结点比其两个子结点大,但是并不知道哪个结点大。在这个地方采取一个巧的方法。将根结点先于左子树的最后一个元素与根结点进行交换。

第二步:

进行交换后,再将T进行删除。删除之后,此时的堆已经变成没有序了。需要对堆的序进行调整。

第三步:

通过对堆的下沉进行调整,使其变为有序。

 

 

 

代码部分的实现在/heap/Heap中

1.5堆---堆的测试 100

本部分代码实现在/test/HeapTest

二、堆排序 101

2.1堆排序  101

对堆的元素大小进行排序处理。

实现将原数据数组,构造成堆heap。102

实现堆的下沉方法。103 

根据待排序的数组来构造成一个堆,完成堆排序 103

测试代码 105

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值