Java排序之堆排序
一、基本概念
要掌握堆排序,先要了解堆这种数据结构。
堆是一个近似完全二叉树的结构,其任意节点满足性质:
Key[i]<=key[2i+1]&&Key[i]<=key[2i+2]或者Key[i]>=Key[2i+1]&&key>=key[2i+2]
即任何一非叶节点的键值不大于或者不小于其左右孩子节点的键值。
大顶堆:满足Key[i]>=Key[2i+1]&&key>=key[2i+2]
小顶堆:满足Key[i]<=Key[2i+1]&&key<=key[2i+2]
排序过程:
- 将初始带排序列构造成大顶堆
- 将堆顶元素与最后一个元素交换,然后从新构造大顶堆
- 重复第2步直到序列有序。
二、算法特点
是否稳定:false
平均时间复杂度:O(nlogn)
最优时间复杂度:O(nlogn)
最差时间复杂度:O(nlogn)
空间复杂度: O(1)
三、相关代码