Java数据结构与算法13——堆

1.堆是什么

堆是一种特殊的二叉树,主要用来解决任务优先级调度类问题。

2.堆的特点

1.堆是完全二叉树

2.堆常常用一个数组来实现,由于堆是完全二叉树,因此这个数组是没有”洞”的

3.堆中每个节点都满足堆的条件

4.堆和二叉搜索树相比是弱序的,堆只要求从根到叶子的每条路径上,节点是按照顺序排列的,而不要求左边一定小于右边。将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。

用数组来表示一颗树
如果数组中节点的索引为x,那么有:
1)它的父节点索引是(x-1)/2
2)它的左子节点索引是 2x+1
3)它的右子节点索引是 2x+2

3.堆的插入、删除、查找算法,并代码示例

3.1 插入

step1.先插入到数组末尾
step2.然后向上筛选,直到它在一个大于它的节点之下,小于它的节点之上的位置

3.2 删除

这里约定始终删除最大值,而且堆以最大值为根。
step1.移走根
step2.把最后一个节点移动到根的位置
step3.向下筛选,直到它在一个大于它的节点之下,小于它的节点之上的位置

3.3 查找

由于堆是弱序的,所以在查找的时候,没有足够的信息来判断应该走哪一个子分支,所以它的查找不是很方便,只能顺序的查找数组的每个项,较慢。

4.堆的效率

堆的效率堆操作的时间复杂度是O(logN),以2为底,比二叉搜索树略慢。

5.堆排序的算法,并代码示例

堆排序基本思想:先循环插入所有的无序数据,然后循环删除最大节点即可。

6.堆排序的效率

问题:
由于堆的新增和删除时间复杂度都是O(logN),并且每个方法执行了 N次,所以整个排序操作需要O(N*logN),跟快速排序一样,但是不如快速排序快,因为在向下筛选数据时,循环次数更多。

改进方法:
去掉新增时的排序,然后对任意排列数据项的数组,再重新排列成堆,这样只需要调用N/2次向下的筛选方法 .堆排序的效率堆排序操作的时间复杂度为O(N*logN),比快速排序略慢,但是它对初始数据的分布不敏感,这点比快速排序优越。

参考

  • 1)Java数据结构和算法精讲版

你可能感兴趣的:(Java数据结构与算法13——堆)