堆排序总结:
1.建堆:
a.找到最后一个结点的父节点,数组下标为(n-1)/2,然后“完全下沉”
b.从上面那个结点挨个调整到第一个节点。
也就是每个节点做 ”完全下沉“ 操作,就是要下沉 每一个变动了的结点,直至到达尾结点或者符合条件。
2.堆下沉:(完全下沉,连锁下沉)
一定是要把这个结点换过来的结点 继续检查交换 ,直到不能再交换 或者 到达二叉树末尾
也就是不是只交换一次,是要把所有变动了的结点都进行检查,直至都符合条件。是一个连锁检查。
3.堆上浮:(完全上浮,连锁上浮)
这里不用判断是左枝还是右枝,因为如果是左枝直接比较;
如果是右枝,因为原来的小顶堆是稳定的,那么左枝肯定要比父节点大,所以肯定不会是左枝移上去,唯一有可能移上去只能是右枝,
所以不用判断左右枝,直接处理新建的结点就行
要注意,一定是要把这个结点换过来的结点 继续检查交换 ,直到不能再交换 或者 到达二叉树顶点
上浮与下沉一样,也是完全上浮。也就是不是只交换一次,是要把所有变动了的结点都进行检查,直至都符合条件。是一个连锁检查
4.堆插入:
插尾:
在最后一个之后插入,
然后对此结点作完全上浮:
5.堆删除:
砍头:
堆删除是 砍掉 父节点。去掉父节点后,为了维护堆的形式,然后把最后一个结点挪到父节点,然后重新 下插父节点。
6.堆排序:
就是循环删除操作:
a.砍头
b.尾(结点)补头(节点)
c头(结点)下沉
重复abc
a.首先可以看到堆建好之后堆中第0个数据是堆中最小的数据。
b.取出这个数据再执行下堆的删除操作。(也就是去掉头节点,然后把尾结点补上来,进行下插,重新调整好堆)
c.这样堆中第0个数据又是堆中最小的数据,重复上述步骤直至堆中只有一个数据时就直接取出这个数据