JAVA 堆 与 优先级队列 关系
一 : 堆 什么是堆? 堆可以理解成一个完全二叉树 只不过堆是以数组的形式表现出来的 满足任意结点的值都大于其子树中结点的值,叫做大堆,或者大根堆,或者最大堆4. 反之,则是小堆,或者小根堆,或者最小堆。 大堆与小堆可以用于筛选数组之中最大值或是最小值, 比如在千万级别的数据中找到前五个最大的值,那么就要建立一个有五个元素的小堆,每一次筛选,如果筛选的元素比堆顶就找到堆顶最小的元素将其换下来 那么怎么进行堆的排序呢? 有向上调整和向下调整 如果是一个不规则的堆,那么就要从最后一个非叶子节点向下调整 这里以大堆举例 public static void shiftDownBig ( int [ ] arr , int sz , int parent ) { int child = 2 * parent + 1 ; // left child // 从parent节点开始,一直调整到叶子节点结束 while ( child < sz ) { //right child : child + 1 从两个孩子节点中选一个最大的 if ( child + 1 < sz && arr [ child + 1 ] > arr [ child ] ) { ++ child ; } if ( arr [ child ] > arr [ parent ] ) { //如果child 大于 parent,