堆排序

若如初见. 提交于 2019-12-02 06:12:20

堆排序

什么是堆?

堆是具有以下性质的完全二叉树:

  • 每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆
  • 或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。

如下图所示:

那么话又说回来了,什么是完全二叉树呢?

要想知道什么是完全二叉树,首先得知道什么满二叉树。

  • 满二叉树:高度为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]

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!