heap
堆是一种特殊的完全二叉树,有最小堆和最大堆两种。
如图为最小堆,满足所有父结点都比子结点小。最大堆反之。
显然最小堆的特性是根结点的值最小。
构建最小堆
算法思想
1.把n个元素建立一个堆,注意这里牺牲了h[0]存储,将n个结点自顶向下,从左到右的方式从1到n编码。这样便将n个结点转换为一棵完全二叉树。
1 |
|
2.从最后一个非叶结点(编号为n/2)开始到根结点(编号为1)逐个扫描,每次扫描就是将结点向下调整。
注:向下调整即让子树符合堆的特性。
—————————————————代码如下——————————————————
1 |
|
向下调整
从编号为i的结点开始向下调整,因为要构建最小堆,所以要让子树中父结点始终是最小的,如果子结点比父结点小,就交换,继续向上调整。
—————————————————代码如下——————————————————
1 |
|
向上调整
最小堆已经构建好了,如果要插入元素需要向上调整。
从编号为i的非叶结点开始向上调整,为了维护最小堆特性,要将该点与其父结点比较,若父结点较小,就交换,继续向上调整。
—————————————————代码如下——————————————————
1 |
|
堆排序实现
算法思想
1.构建最大堆,这样最大的元素在h[1],然后将h[1]与h[n]交换(最大的已归位),记得h[1]向下调整以保持堆的特性。
2.执行–n,h[1]与h[n]交换(第二大的已归为),h[1]向下调整。如此反复,直到堆的大小为1。
堆排序的时间复杂度O(n log n)
—————————————————代码如下——————————————————
1 |
|
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!