堆排序的中间数据结构是完全二叉树,通过控制数组元素的下标实现。
堆的定义:n个元素的序列 {k1,k2,...,kn} 当且仅当满足下关系时,称之为堆。
(1) ki<=k2i (完全二叉树,k2i与k2i+1是ki的下级结点)
ki<=k2i+1
(2) ki>=k2i
ki>=k2i+1
(i=1,2,...,n/2)
i是中间结点或非终端结点。堆顶元素是最小值或最大值。从定义可知,堆是层次有序,一个结点比下一层的下级结点大或小,因此比所有下级结点大或者小。而快速排序则是结构有序,左子树比根结点小,右子树比根结点大。堆排序保存了排序的中间过程,比冒泡法的最值序列减少了比较次数。锦标赛排序算法用树形保留比较的过程,然而存储空间多,最值重复比较,因此调优发现了堆。
例题是清华大学版的《数据结构》10.4.3 堆排序和《编程珠玑》第14章 堆。
Heapsort算法原理
(1)建堆。建立层次有序的堆。在编程珠玑的隐式树中,完全二叉树,所有叶结点是最后一个层次,叶结点的上级结点应调整,维护堆。因此最后一个中间结点的下标是n/2,建堆是每