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