堆排序

最大堆和最小堆广泛用于各种场景,JAVA中的PriorityQueue,操作系统的线程调度(看资料有人说,自己没研究),以及HBase中各种Scanner都是以堆的形式。最大堆是指根节点是整个集合中的最大值,最小堆是指根节点是整个集合中的最小值,这里以PriorityQueue的源码为例了解堆。

增加一个节点:(从下往上找)

为新增加的节点也就是最后的节点找位置

 private final void upHeap() {

   int i = size; //堆大小

    Tnode = heap[i];      //最后插入的节点            // save bottom node

   int j = i >>> 1;//插入节点的父节点位置

   while (j > 0 && lessThan(node, heap[j])) {//从父节点开始向上一次查找,如果父节点小于刚插入的node

     heap[i] = heap[j];//就把子节点的值赋值给父节点                       // shift parents down

     i = j;// j的值赋值给i

     j = j >>> 1;//j继续找j的父节点位置

    }

   heap[i] = node;                                       // install saved node

  }

删除一个节点(从上往下找)


堆删除节点的方法,其实和给最后一个节点node找位置,从根节点开始找自己最小的子节点与node比较如果小于node,则把该节点的值赋值给父节点


 private final void downHeap() {

   int i = 1;//根节点位置

    Tnode = heap[i];      //根节点的node值                    // save top node

   int j = i << 1;//子节点的位置                                // find smaller child

   int k = j + 1;//另一个子节点的位置

   if (k <= size && lessThan(heap[k], heap[j])) {//找到比较小的子节点位置

     j = k;

    }

   while (j <= size && lessThan(heap[j], node)) {//如果j<=size并且heap[j]小于node的值

      heap[i] = heap[j];//赋值给父节点                            // shift up child

     i = j;//j的值赋值为i

     j = i << 1;//找到j的子节点位置

     k = j + 1;//找到j的另一个子节点位置

     if (k <= size && lessThan(heap[k], heap[j])) {//找到较小的子节点

         j= k;

     }

    }

   heap[i] = node;         //node安放在i的位置                       // install saved node

  }

}


堆排序就是先建立一个最大堆,然后把根节点跟最后的节点交换位置,然后把前n-1个集合数重新组合成最大堆,重复以上操作直到只剩一个节点。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 堆是一棵满足一定性质的二叉树,具体的讲堆具有如下性质:父节点的键值总是不大于它的孩子节点的键值(小顶堆), 堆可以...
    9527Roy阅读 683评论 0 0
  • 姓名:王怀帅 学号:16040410035 转载自:http://www.jianshu.com/p/86428c...
    错错对阅读 229评论 0 1
  • 堆排序 堆排序基本简介 1991年的计算机先驱奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德(Robert ...
    BlackMammba阅读 1,898评论 0 10
  • 罗振宇说:未来社会最重要的资产是影响力。 《影响力》一书,从六大基本原则:互惠、承诺和一致、社会认同、喜好、权威和...
    Claudia_C阅读 405评论 0 0