堆
在学习堆排序之前,先必须了解一下什么是
堆
堆是具有以下性质的完全二叉树
:
每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。
而二叉树中,父节点与左右孩子节点的编号下标都有一定的关系:
其中父节点与左孩子节点的关系是 i -> 2i+1
, 父节点与右孩子节点的关系是 i -> 2i+2
注: 这里指节点的下标关系
堆的向下调整性质
假设: 节点的左右字数都是堆,但自身不是堆
当根节点的左右字数都是堆时,可以通过一次向下的调整来将其变换成一个堆
挨个出数
9
是堆中数字最大,将9
取出,为保证完全二叉树,将树中最后的数字3
添加到头部.
接下来向下调整
依次取数便取出一个升序列表
堆排序的平均时间复杂度为 Ο(nlogn)
堆的算法步骤
创建一个堆 H[0……n-1];
把堆首(最大值)和堆尾互换;
把堆的尺寸缩小 1,并调用 shift_down(0),目的是把新的数组顶端数据调整到相应位置;
重复步骤 2,直到堆的尺寸为 1。
来源:https://github.com/hustcc/JS-Sorting-Algorithm
算法实现
1 | def sift(li, low, high): |