简谈堆结构和堆排序

219 阅读1分钟

一.想搞懂堆结构首先得了解什么是完全二叉树

两句话,中间一定是满节点,最后一层要么是满的,要么从左到右是一个变满的状态。

二.堆

1.堆是一个完全二叉树

2.谈堆只有大根堆和小根堆

什么意思?比如大根堆,每个节点在以它为顶点的树中是最大的。

三.关于完全二叉树的一些公式

如果索引从0开始,那么对于任意一个i,它的左孩子是2i+1,它的右孩子是2i+2,它的父亲是(i-1)/2

四.关于堆的常见算法

1.比如每次给你一个树让你将这数组成一个大根堆

思路:每加一个数,把这个数和其父节点pk,谁大谁上,一直持续此过程到根节点

2.比如让你返回堆中最大的值,然后删除这个值,让其他元素依然是一个大根堆

思路:先记录第一个位置的数(大根堆),然后将最后一个位置的元素替换到第一个位置,然后分别看该值的左右两个孩子,谁大和谁交换,一直持续此过程直到自己没有左右孩子

3.堆排序

将一堆数组成一个堆结构,依次弹出最大/最小的数即可。