排序六 堆排序
目录 堆的概念 要点 算法分析 堆排序算法的总体情况 时间复杂度 算法稳定性 完整参考代码 JAVA版本 参考资料 相关阅读 说明 堆的概念 在介绍堆排序之前,首先需要说明一下,堆是个什么玩意儿。 堆 是一棵 顺序存储 的 完全二叉树 。 其中每个结点的关键字都 不大于 其孩子结点的关键字,这样的堆称为 小根堆 。 其中每个结点的关键字都 不小于 其孩子结点的关键字,这样的堆称为 大根堆 。 举例来说,对于n个元素的序列{R0, R1, ... , Rn}当且仅当满足下列关系之一时,称之为堆: (1) Ri <= R2i+1 且 Ri <= R2i+2 ( 小根堆) (2) Ri >= R2i+1 且 Ri >= R2i+2 ( 大根堆) 其中i=1,2,…,n/2向下取整; 如上图所示,序列R{3, 8, 15, 31, 25}是一个典型的小根堆。 堆中有两个父结点,元素3和元素8。 元素3在数组中以R[0]表示,它的左孩子结点是R[1],右孩子结点是R[2]。 元素8在数组中以R[1]表示,它的左孩子结点是R[3],右孩子结点是R[4],它的父结点是R[0]。可以看出,它们 满足以下规律 : 设当前元素在数组中以 R[i] 表示,那么, (1) 它的 左孩子结点 是: R[2*i+1] ; (2) 它的 右孩子结点 是: R[2*i+2] ; (3) 它的