堆排序的介绍
堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。可以利用数组的特点快速定位指定索引的元素。堆分为大根堆和小根堆,是完全二叉树。
- 完全二叉树:除了最后一层之外的其他每一层都被完全填充,每一层从左到右的填充数据,不能空缺
- 大根堆:任意一个节点的值均大于等于它的左右孩子的值,位于堆顶的节点值最大
- 小根堆:任意一个节点的值均小于等于它的左右孩子的值,位于堆顶的节点值最小
本节分享的堆排序以大根堆为例子
堆排序的实现步骤
把一个数组调整为大根堆(heapInsert)
假设当前节点的下标为i,那么它的父亲节点为(i-1)/2,每次heapInsert的时候就把insert进来的节点与它的父亲节点进行比较,比它的父节点大就交换,一直重复调整
每次把堆顶放到最后的节点位置,然后调整整个堆为大根堆(heapify)
每次把堆顶的节点放到最后,然后堆大小减1,然后调整为大根堆,一直重复,直到大根堆的大小为0为止
代码实现
1 | import java.util.Arrays; |
运行截图
以上就是今天分享的堆排序,主要操作是heapInsert和heapify,时间复杂度为O(N*logN),空间复杂度为O(1)