贡献者: 有机物
前文讲到了 “堆” 这个数据结构,这里来讲一下堆排序这个排序算法。
堆排序是用二叉堆这种数据结构实现的排序算法,从小到大排序的话是实现小根堆,而从大到小则相反。这里以实现从小到大排序为例。
具体做法是每次假设堆已经建好了,由于是小根堆,所以只需每次输出堆顶元素,再把堆顶删除,涉及到了三种操作:
由于只有删除堆顶这个操作,所以只需要实现 down 操作。那如何来建堆呢?朴素方法是一个一个往堆中插入,但这种方法太慢了,有一个
为什么从
为什么建堆的时间复杂度是
证明:
一棵完全二叉树上有
所以:
那么上面的公式是不是
证毕。
down 操作在堆这篇文章讲了,这里不再赘述。
由于堆排序并没有设计到随机删除或修改,所以直接交换堆中的元素即可,不需要使用复杂度特殊的堆交换方式。
数组模拟堆排序:
由于堆排序并没有涉及到随机删除或修改,因此可以用 C++ STL 库里的优先队列。
友情链接: 超理论坛 | ©小时科技 保留一切权利