概述
堆排序
即是利用堆
这个数据结构来完成排序的.所以,要想理解堆排序
就要先了解堆
.
堆
堆(Heap)
是一种数据结构,它可以被看做是一棵树的数组对象.一个二叉堆
拥有以下性质.
- 父节点
k
的左子节点在数组中的索引位置为2 * k + 1
.
- 父节点
k
的右子节点在数组中的索引位置为2 * k + 2
.
- 子节点
i
的父节点在数组中的索引位置为(i - 1) / 2
.
- 父节点
k
的任意子节点都必须小于(或大于)k
.
- 根节点必须是最大节点(或最小节点).
最大堆代码实现
|
|
优先队列
普通的队列是基于先进先出
的,也就是说最先入队的元素永远是在第一位,而优先队列
中的每一个元素都是拥有优先级
的,优先级
最高的元素永远在第一位.
优先队列
也是贪心算法
的体现,所谓的贪心算法
即是在问题求解的每一步中总是选择当前最好的结果.
堆
就是用于实现优先队列
的,因为堆
的性质与优先队列
十分吻合.
添加
往优先队列
中添加元素时,我们只需要将元素添加到数组末尾并调整堆(以下例子均是以最大堆为例).
|
|
删除
删除操作要稍微麻烦一点,将优先队列
中末尾的元素放到队头并进行堆调整.
|
|
堆排序
实现堆排序
有两种方法,一种是使用优先队列
,另一种是直接使用堆
.
直接使用堆实现堆排序
|
|
使用优先队列实现堆排序
|
|
本文作者为SylvanasSun(sylvanassun_xtz@163.com),转载请务必指明原文链接.