[转载] 《算法导论》和 百度百科
(二叉)堆是一个数组,它可以被看成一个近似的完全二叉树。树上的每一个节点对应数组中的一个元素。除最底层(叶子层)外其它层都是满的。 规定树的根结点是A[1],这样给定一个节点的下标i,我们可以 很容易计算它的父节点、左孩子、右孩子的下标。
PARENT(i)=i/2; LEFT(i)=2*i; RIGHT(i)=2*i+1;(二叉)堆可分为两种形式:最大堆和最小堆。 最大堆要满足如下性质:
A[PARENT(i)]>=A[i]即除了根节点以外的所有节点,其父节点的值要大于等于该节点的值。 最小堆是满足如下性质:
A[PARENT(i)]<=A[i]在从小到大的堆排序中,我们使用最大堆。
建堆时间复杂度是O(n),堆排序是O(nlgn)。所以总的时间复杂度是O(nlgn)。
和其它排序算法的比较: 算法思想类似于选择排序,而且也是不稳定的排序算法。因为简单选择排序每次通过比较找到最大元素,堆排序是通过维护最大堆的性质在根节点找到最大元素,然后放到数组最后,直到所有节点都排好序。既然类似选择排序,那也会影响等值元素在数组中的原有顺序,从而破坏稳定性。
新闻热点
疑难解答