在分析堆排序之前,我先讲一讲什么是堆
如果一棵树中每个节点的关键字都大于或等于所有子节点中的关键字(子节点存在),那么就称树是堆有序的,在一棵堆有序的树中,不存在关键字大于根节点关键字的节点,那么什么是堆呢?
堆是一个节点的集合,表现形式为数组,其中关键字按照堆有序的完全二叉树的形式排列
如上图,上图是一个完全二叉树,而且每个关键字都大于他的任意一个子节点(子节点存在),把这棵树放到数组里面,如下:
arr[] = {X, T, O, G,S,M, N, A, E, R, A, I}
放到数组里面,位置i处的子节点是2*i + 1和2*i + 2,N个节点的完全二叉树中的每条路径越有lgN个节点
堆分为大根堆和小根堆,顾名思义,大根堆就是树中根节点是最大的关键字的堆,小根堆就是根节点是较小的根节点的堆,上面的堆是大根堆,所以我们来讨论一下大根堆
那么如何来构造一个大根堆呢?
两种方法:
1.自底向上堆化
假设有一个大根堆,它的某个个节点的关键字大于那个节点的父节点的关键字,堆的性质受到侵犯,那么我们可以交换该节点和父节点,交换