堆排序讲解

本文从堆的数据结构开始讲解,以升序排列(使用最大堆)进行讲解,先介绍了堆排序的两个重要过程,最后讲解堆排序过程

  • 完全二叉树:二叉树中除最后一层外其他各层的节点数均达到最大值,最后一层的节点都连续集中在最左边。
  • 堆是一个数组,可以看成是一个近似的完全二叉数,树上的每一个结点对应数组中的一个元素(从上往下,从左往右进行编号)
    例如:
    堆排序讲解_第1张图片
  • 两个属性
    1. lengh:堆的元素个数
    2. heapsize:堆元素的有效范围,进行堆排序时会用到,将堆顶放到最后后从堆中去除
  • 最大堆
    任一结点的值大于或等于其子结点的值
  • 最小堆
    任一结点的值小于或等于其子结点的值

维护堆的性质

  • 伪代码:
    堆排序讲解_第2张图片
  • 输入参数
    A为数组,i为需要修复的结点的位置(从1开始)
  • 过程描述
    假设当前结点的左右子树都符合最大堆性质,选出当前节点、左节点、右节点中值最大的结点,如果这个结点就是当前节点则不需要修复;如果是左结点或是右结点,则将当前结点的值与最大值的结点交换值,交换值后之前最大值所在的结点可能破坏最大堆的性质,所以再对这个结点进行修复,如此递归下去
  • 实例演示
    堆排序讲解_第3张图片

构建最大堆

  • 伪代码
    在这里插入图片描述
  • 过程描述
    因为序号在length/2之后的结点都是叶子结点且叶子结点符合最大堆性质,所以只需依下往上修复即可得到最大堆(因为每次执行修复的时候当前结点的子树必定是符合最大堆性质的)
  • 实例演示
    堆排序讲解_第4张图片

堆排序

  • 伪代码
    堆排序讲解_第5张图片
  • 过程描述
    构建最大堆后,堆顶元素一定是最大的,所以将堆顶元素放在数组最后,此时该元素已经处于正确位置,减小heapsize的值将该元素移除最大堆的范围,把原来在末尾的元素放到堆顶,因为堆顶的子树都符合最大堆性质,所以对堆顶进行修复得到新的最大堆,如此循环进行下去直到所有元素都在正确的位置上。
  • 实例演示
    堆排序讲解_第6张图片

你可能感兴趣的:(算法)