堆排序,英文名称 Heapsort,利用二叉树(堆)这种数据结构所设计的一种排序算法,是一种对直接选择排序的一种改建算法。在逻辑结构上是按照二叉树存储结构,正是这种结构优化了选择排序的性能,在物理存储上是连续的数组存储,它利用了数组的特点快速定位指定索引的元素。
什么是堆
- 结构性: 堆是一个完全二叉树,完全二叉树要求树的节点从左到右排列,除最后一层外,每层的节点个数都是满的。
- 堆序性: 堆中每一个节点的值都必须大于等于(或小于等于)其子树中每个节点的值,对于每个节点大于等于子节点值的堆称为大顶堆;每个节点小于等于子节点值的堆称为小顶堆;
堆的存储方式
完全二叉树比较适合用数组来存储,除根节点外,节点i的左子节点的下标为i2,右子节点的下标为i2+1,父节点的坐标为i/2,根节点没有父节点,下标为0的空间暂时用不到;
如图所示:
推出结论:
1 | parentNo = (nodeNo) / 2 |
堆的插入和删除
堆的插入和删除都要满足结构性和堆序性,比如插入一个新节点,该节点小于父节点值,则需要将该节点与父节点交换位置;递归此过程,直到重新满足堆序性为止;
插入(INSERT)
删除(Delete)
大顶堆排序代码实现
1 | class MaxHeap |
结果
1 | 1 |