概念
堆在树中是一个完成二叉树 堆分为大顶堆和小顶堆 大顶堆: 非叶子结点的值大于或等于其左右孩子结点 小顶堆: 非叶子结点的值小于或等于其左右孩子结点 特征: 堆的根结点的值肯定是极值
堆排序的实现步骤
构建完全二叉树 将此完全二叉树调整为堆 根据堆的特性,使用选择排序
构建完全二叉树:
待排序数字为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)
稳定性:
不稳定