本文首发于:面试必知必会|理解堆和堆排序 微信公众号:后端技术指南针
持续输出干货 欢迎关注 惊喜直达!
本文将阐述堆和堆排序的基本原理,通过本文将了解到以下内容:
- 堆数据结构的定义
- 堆的数组表示
- 堆的调整函数
- 堆排序实践
1.堆的简介
堆是计算机科学中的一种特别的树状数据结构。
若是满足以下特性,即可称为堆:给定堆中任意节点P和C,若P是C的母节点,那么P的值会小于等于C的值。若母节点的值恒小于等于子节点的值,此堆称为最小堆;反之称为最大堆。
堆始于J. W. J. Williams在1964年发表的堆排序,当时他提出了二叉堆树作为此算法的数据结构,堆在戴克斯特拉算法和带优先级队列中亦为重要的关键。
维基百科-堆
数据结构中的堆区别于内存分配的堆,我们说的用于排序的堆是一种表示元素集合的结构,堆是一种二叉树。
堆有两个决定性特性:元素顺序和树的形状
- 元素顺序:
在堆中任何结点与其子结点的大小都遵守数值大小关系。
A. 如果结点大于等于其所有子结点,也就是堆的根是所有元素中最大的,这种堆称为大根堆(大顶堆、最大堆);
B. 如果结点小于等于其所有子结点,也就是堆的根是所有元素中最小的,这种堆称为小根堆(小顶堆、最小堆);
C. 大根堆/小根堆只是约定了父结点和子结点的大小关系,但是并不约束子结点的相对大小和顺序;
如图为小根堆结构:
- 树的形状:
堆这种二叉树最多在两层具有叶子结点,并且最底层的叶子结点靠左分布,该树种不存在空闲位置,也就是堆是个完全二叉树。上述的两种性质可以保证快捷找到最值,并且在插入和删除新元素时可以实现重新组织再次满足堆的性质。
2.堆的数组表示
堆中没有空闲位置并且数组是连续的,但是数组的下标是从0开始,为了统一,