堆排序有点小复杂,分红三块html
第一块,什么是堆,什么是最大堆数组
第二块,怎么将堆调整为最大堆,这部分是重点数据结构
第三块,堆排序介绍htm
第一块,什么是堆,什么是最大堆blog
什么是堆排序
这里的堆(二叉堆),指得不是堆栈的那个堆,而是一种数据结构。递归
堆能够视为一棵彻底的二叉树,彻底二叉树的一个“优秀”的性质是,除了最底层以外,每一层都是满的,这使得堆能够利用数组来表示,每个结点对应数组中的一个元素.索引
数组与堆之间的关系get
二叉堆通常分为两种:最大堆和最小堆。it
什么是最大堆
堆中每一个父节点的元素值都大于等于其孩子结点(若是存在),这样的堆就是一个最大堆
所以,最大堆中的最大元素值出如今根结点(堆顶)
节点与数组索引关系
对于给定的某个结点的下标i,能够很容易的计算出这个结点的父结点、孩子结点的下标,并且计算公式很漂亮很简约
第二块,怎么将堆调整为最大堆,这部分是重点
整个过程以下图所示
在4,14,7这个小堆里边,父节点4小于左孩子14,因此二者交换
在4,2,8这个小堆里边,父节点4小于右孩子8,因此二者交换
上图展现了一趟调整的过程,这个过程递归实现,直到调整为最大堆为止
第三块,堆排序介绍
堆排序就是把堆顶的最大数取出,
将剩余的堆继续调整为最大堆,具体过程在第二块有介绍,以递归实现
剩余部分调整为最大堆后,再次将堆顶的最大数取出,再将剩余部分调整为最大堆,这个过程持续到剩余数只有一个时结束
下边三张图详细描述了整个过程
参考文章
http://www.cnblogs.com/kkun/archive/2011/11/23/2260286.html