堆排序(Heap Sort)
  • 概念

        堆在树中是一个完成二叉树
        堆分为大顶堆和小顶堆
        大顶堆: 非叶子结点的值大于或等于其左右孩子结点
        小顶堆: 非叶子结点的值小于或等于其左右孩子结点
        特征: 堆的根结点的值肯定是极值
  • 堆排序的实现步骤

        构建完全二叉树
        将此完全二叉树调整为堆
        根据堆的特性,使用选择排序
  • 构建完全二叉树:

        待排序数字为30,20,80,40,50,10,60,70,90
        用什么数据类型存储,且如何和完全二叉树的特性构建关联?
            使用列表存储数据,层序遍历完全二叉树,使用完全二叉树的性质5可以知晓
            父结点的索引.
        构造一个列表[0,30,20,80,40,50,10,60,70,90],添0是为了方便控制.

  • 调整二叉树为堆(大顶堆):

            从哪开始调整?
                从哪个结点开始?
                    从完全二叉树的最后一个结点的父节点开始
                下一个结点是谁?
                    从起始结点开始向左找其同层结点,到头后再从上一层的最右边结点开始
                    继续向左逐个查找,直至根结点.
            调整方法?
                根据完全二叉树性质,父节点为n,左孩子结点为n//2,右孩子结点为n//2+1
                首先比较左右孩子结点大小,取得它们最大值,再将父节点与此最大值进行
                比较,从而判断是否调整.



  • 选择排序

        调整好的大顶堆,其根结点是最大值.因此可以使用选择排序,将其极值抓取,
        从而排好序.
        如何选择,怎么处理?
            每次将调整好的大顶堆根结点值,与最后一个叶子结点值交换.并将除最大值
            以外的完全二叉树重新调整为大顶堆.
        每次拿走最大值后的完全二叉树,从哪个结点进行调整?
            此时可以直接从根结点开始调整,由于第一次调整过的原因.

  •     堆排序的总结:

     

     时间复杂度:

          堆排序跟序列开始的顺序无关,因此最差和最好情况都一样.其时间复杂度都为O(nlogn).

     空间复杂度 :

          元素根据索引赋值,其内存空间的大小不变.空间复杂度O(n)

     稳定性:

          不稳定