python 实现·十大排序算法之堆排序 (Heap Sort)
简介
堆排序(Heap Sort)是利用堆这种数据结构而设计的一种排序算法,是一种选择排序。
堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。
堆排序思路为: 将一个无序序列调整为一个堆,就能找出序列中的最大值(或最小值),然后将找出的这个元素与末尾元素交换,这样有序序列元素就增加一个,无序序列元素就减少一个,对新的无序序列重复操作,从而实现排序。
算法实现步骤
构造初始堆。将给定无序序列构造成一个大顶堆(一般升序采用大顶堆,降序采用小顶堆);
将堆顶元素与末尾元素进行交换,使末尾元素最大。然后继续调整堆,再将堆顶元素与末尾元素交换,得到第二大元素;
重新调整结构,使其满足堆定义,然后继续交换堆顶元素与当前末尾元素;
如此反复进行交换、重建、交换,直到整个序列有序。
Python 代码实现
动画演示
算法分析
时间复杂度
在每次重建时,随着堆的容量的减小,层数会下降,函数时间复杂度会变化。重建堆一共需要n-1次循环,每次循环的比较次数为,则相加为:
所以堆排序时间复杂度为。
空间复杂度
空间复杂度就是在交换元素时那个临时变量所占的内存空间,所以堆排序空间复杂度为。
稳定性
堆排序在交换数据的时候,是比较父结点和子节点之间的数据,所以,即便是存在两个数值相等的兄弟节点,它们的相对顺序在排序也可能发生变化。因此,堆排序是不稳定的。
综合评价
联系我们
个人博客网站:http://www.bling2.cn/
Github地址:https://github.com/lb971216008/Use-Python-to-Achieve
知乎专栏:https://zhuanlan.zhihu.com/Use-Python-to-Achieve
小专栏:https://xiaozhuanlan.com/Use-Python-to-Achieve
博客园:https://www.cnblogs.com/Use-Python-to-Achieve
版权声明: 本文为 InfoQ 作者【南风以南】的原创文章。
原文链接:【http://xie.infoq.cn/article/1165c5087baac2656ee2c2c6c】。
本文遵守【CC BY-NC】协议,转载请保留原文出处及本版权声明。
评论