堆排序
什么是堆?
堆是具有以下性质的完全二叉树:
- 每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆
- 或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。
如下图所示:
那么话又说回来了,什么是完全二叉树呢?
要想知道什么是完全二叉树,首先得知道什么满二叉树。
- 满二叉树:高度为h,并且由 2^h-1个结点的二叉树,被称为满二叉树,其实不难看出,满二叉树的结点的度要么为0(叶子结点),要么为2(非叶子结点)
- 完全二叉树:一棵二叉树中,只有最下面两层结点的度可以小于2,并且最下一层的叶结点集中在靠左的若干位置上。这样的二叉树称为完全二叉树。
特点:叶子结点只能出现在最下层和次下层,且最下层的叶子结点集中在树的左部。显然,一棵满二叉树必定是一棵完全二叉树,而完全二叉树未必是满二叉树。
堆与一维数组的映射关系
同时,我们对堆中的结点按层进行编号,将这种逻辑结构映射到数组中就是下面这个样子
简单的说对于二叉树中的任意一个节点,假设它的下标为i,那么它左孩子的节点在数组中的下标就是2i+1,而其左孩子节点的下标就是2i+2
因此对于大顶堆来说满足一下的条件:
大顶堆:arr[i] >= arr[2i+1] && arr[i] >= arr[2i+2]
对于小顶堆来说满足
小顶堆:arr[i] <= arr[2i+1] && arr[i] <= arr[2i+2]