这个排序看了很久都没有理解它的要意所在,定义一个数组A[1….n];
1. 初始化大根堆(小根堆)的目的是什么?
这里书上大概会说是利用大根堆(小根堆)的特性,父节点始终大于叶子结点。所以在建立完大根堆(小根堆)后父节点始终是最大的(小根堆就是最小的),这里的思想和冒泡有点类似。
2. 初始化完了之后怎么做?
后面我才知道这个要反着来,当建立大根堆的时候A[0]是整数组最小的元素(这里指的都是小根堆),这个信息很关键,还有一个信息就是每次调整堆后A[0]都会是整个堆(我一直喜欢说二叉树)的最小元素,所以现在要做的就是移除顶节点再重建堆。这样每次移除的顶节点所组成的序列就是有序的。在这里我一直认为有优化的空间,虽然堆的特性决定了在重建堆的时候可以减少一些交换次数,但是重复比较依然存在。
在这里我自己陷入一个误区就是在建立小根堆后始终想顺着这些大致排好序的序列进行调整,以达到最终的目的,虽然找到一些规律,但始终没有找到解决办法。
3. 关于时间复杂度
时间分为两部分,第一部分是初始化堆,第二部分就是排序时重建堆,初始化堆的时候n的循环时间代价是O(n),后面重建堆的时候是O(n),而重建堆的时间是O(lgn)(这里的lg是log2),也不知道这O(nlgn)是不是这么算出来的。