堆排序的步骤

堆排序的核心是什么?
借助堆数据结构,不断输出当前堆顶元素(小根堆),每次堆顶离开当前堆后,对剩余元素重新调整成堆,直到堆中只剩下一个元素;元素的输出序列可转换成元素的有序序列。

堆排序的步骤:
1. 当一个节点被插入时,将该节点放在堆的末尾(这是为了保证堆是完全二叉树);
2. 然后将该节点与它的父节点比较,看该节点是否大于(或小于)其父节点,即判断当前的堆是否满足堆序;
3. 如果不满足,则将该节点与其父节点交换。再将该节点与其新的父节点做比较,依此类推,直到该节点不再需要与其父节点交换为止;
4. (即满足堆序时停止)当一个根节点被弹出(即被从堆中删除)时,将堆最尾部的节点移动到头结点的位置,然后将该节点不断与其子节点比较,如果不符合堆序则交换,直到符合堆序为止。


下滤
当堆底插入新元素时,如果新插入元素大于其父元素,堆序性被破坏,此时应将插入元素与其父元素交换位置,直至满足堆序性。

上滤
堆顶元素被删除时,将堆底元素插入堆顶,当插入元素小于子节点时,堆的堆序性被破坏,将插入元素与子节点的较大值交换顺序。
继续此操作直至该堆成为一个合法的大根堆为止。

在插入堆的时候,使用下滤维护堆序性,在删除堆顶元素时,使用上滤来维护堆序性。

将一个数组转化为大根堆或小根堆的思路是,从最后一个非叶子节点向根节点出发,依次进行下滤,这样就可以得到一个满足堆排序的数组。
然后每次弹出根元素后进行上滤操作维护堆序性,就可以实现堆排序

heapq类实现的是小根堆。可以将每个值乘以-1从而可以用该类实现大根堆

posted @ 2023-06-23 23:47  sangern  阅读(50)  评论(0编辑  收藏  举报