排序6:堆排序
6.1概念以及分类
6.1.1树(学堆需要的基础)
度的概念:出度(树中一个数字下面的数如:上图2的出度为4,4的出度为0),入度(上一个数)
二叉树:整个树中最多有两个分叉(出度)
子节点,父节点:2,3是1的孩子节点分别为左孩子,右孩子。1是2,3的父节点(或双亲节点),2是4,5的父节点。
叶子结点:4,5,6,8出度为0成为叶子结点
6.1.2堆
大根堆:父节点均大于子节点
小根堆:父节点均小于子节点
例1:线性1 2 3 4 5 6 7 8画成树,数字从左向右,从上到下安排到各个树的节点,如下图,为小根堆
例2:下图既有父节点大于子节点又有子节点大于父节点,因此不是堆
6.2堆排序原理
设原数据:
化为树
如果是升序排序,调整为大根堆:从最后一层二叉树往上
①最后一层二叉树调整:(红色小字体为下标)
在大根堆中最大值就是树根
② 最后一层和倒数第二层调整(内部一次调整是从上往下交换父节点小于子节点的数字:1和21交换再1和6交换):
③三层二叉树整体调整:(21和9交换)
把树根的值与待排序最后一个值交换,交换后21有序
交换后破坏了大根堆,再次调整为大根堆(排除已经有序的21),因为大部分保持大根堆,这次调整从整体调整即可
倒数第二大值12出现,与除21外最后的待排数字3交换
再整体调整为大根堆并与待排最后的数字交换(待排指的是不含已经排好的数字)