目录
堆的定义
建立初始化堆的步骤
建立大根堆的代码
大根堆排序的代码
算法效率分析
稳定性
堆的定义
回忆
基于选择排序的特性:选取关键字最小(或者最大)的元素放入到序列里面,知道了大堆和小堆概念,所以将数组转换为二叉树用大小堆,进行选择排序比较方便
建立初始化堆的步骤
下面讲解给了初始序列(数组形式)如何转换为大根堆的样子来进行选择排序
非终端结点就是i<=n/2,即8/2=4,数组下标是01234的,后面的5678下标都是叶子结点不用管
调整后的样子如下
建立大根堆的代码
得到
09小元素下坠如下: (每次把最大的元素往上面放)09的左右子树当中右子树78最大,78上移
09还是小于左右子树,此时左子树65大于53,所以把65上移,09下坠到65的位置 得到如下:
完成了第一趟的处理,效果是把最大元素放到末尾,上面树成为大根堆的形式
第二趟
78和53交换
交换得到如下 78和87已经放到最后就暂时不用考虑了
53进行下坠,和65换位置得到如下: (78放到最后了不需要和53比较)
剩余元素成为了大根堆,如下所圈出来部分
第三趟
得到
下坠:
得到如下,所圈出来部分又是大根堆
依次类推,得到结果
大根堆排序的代码
算法效率分析
只需要记住建堆的过程,关键字对比次数不超过4n,建堆的时间复杂度=O(n)
稳定性
堆排序不稳定