完全二叉树是叶子节点只能出现在最下层和次下层,且最下层的叶子节点集中在树的左部。
堆是有如下特点的完全二叉树
根节点的值>=子节点的值,即大顶堆
根节点的值<=子节点的值,即小顶堆
构建大顶堆
从0开始,将每一个数字依次插入,一边插入一边调整堆的结构,使之满足大顶堆的要求
将整个数列试作完全二叉树,自底向上调整树的结构,使之满足大顶堆的要求
建堆与堆化
建堆即构建堆
堆化是从当前位置开始调整数组使之满足堆的特征
堆排序的过程
构建大顶堆
取出堆顶元素
调整剩余数字使之符合大顶堆特点
再次取出堆顶元素
循环往复
完全二叉树的性质(根节点下标为0)
下标i的左子节点下标:2 * i + 1
下表i的右子节点下标:左下标+1
最后一个非叶子节点下标:n/2-1
堆排序的复杂度分析
堆排序的时间复杂度为O(n log n),堆排序的空间复杂度为 O(1)。
时间复杂度分析由建堆和堆化两个,其中建堆的时间复杂度是O(n),堆化的时间复杂度是O(n log n)
堆排序代码
1 |
|