• 数据结构-堆 Java实现


    数据结构-堆 Java实现。 实现堆自动增长

      1 /**
      2  * 数据结构-堆。 自动增长
      3  *
      4  * @author caiyao  5  */
      6 public class Heap<T extends Comparable> {
      7 
      8     private Object[] node;
      9 
     10     private static final int DEFAULT_SIZE = 10;
     11 
     12     private int size = 0;
     13 
     14     private int capacity;
     15 
     16     private Type type;
     17 
     18     public Heap(Type type){
     19         this(type,DEFAULT_SIZE);
     20     }
     21 
     22     public Heap(Type type, int initCapacity){
     23         node = new Object[initCapacity];
     24         this.capacity = initCapacity;
     25         this.type = type;
     26     }
     27 
     28     /**
     29      * 插入
     30      * @param newNode
     31      */
     32     public void insert(T newNode){
     33         ensureCapacity(size + 2); // 新节点和空着的0号节点
     34         node[size + 1] = newNode;
     35         upAdjust();
     36         size ++;
     37     }
     38     private void upAdjust(){
     39         for(
     40                 int currentNodeIndex = size + 1;
     41                 (
     42                         currentNodeIndex > 1 && ((T)node[currentNodeIndex]).compareTo(node[currentNodeIndex / 2]) < 0 && type == Type.MIN
     43                 ) ||
     44                 (
     45                         currentNodeIndex > 1 && ((T)node[currentNodeIndex]).compareTo(node[currentNodeIndex / 2]) > 0 && type == Type.MAX
     46                 );
     47                 currentNodeIndex = currentNodeIndex / 2
     48                 ){
     49             Object tempValue = node[currentNodeIndex];
     50             node[currentNodeIndex] = node[currentNodeIndex / 2];
     51             node[currentNodeIndex / 2] = tempValue;
     52         }
     53     }
     54     private void ensureCapacity(int newSize){
     55         if(newSize > DEFAULT_SIZE && newSize > this.capacity){
     56             grow();
     57         }
     58     }
     59     private void grow(){
     60         int newSize = capacity + (capacity >> 1); // 扩大50%容量
     61         node = Arrays.copyOf(node,newSize);
     62     }
     63     /**
     64      * 返回堆顶
     65      * @return
     66      */
     67     public T top(){
     68         return (T)node[0];
     69     }
     70 
     71     /**
     72      * 返回堆顶并从堆中移除
     73      * @return
     74      */
     75     public T pop(){
     76         T top = (T)node[0];
     77         downAdjust();
     78         node[size] = null;
     79         return top;
     80     }
     81     private void downAdjust(){
     82         node[0] = node[size - 1];
     83         for(
     84                 int currentNode = 1;
     85                 ;
     86                 ){
     87                 // 小根堆 + 左子树
     88                 if(type == Type.MIN && currentNode * 2 <= size && ((T)node[currentNode * 2]).compareTo(node[currentNode]) < 0){
     89                     Object tempValue = node[currentNode];
     90                     node[currentNode] = node[currentNode * 2];
     91                     node[currentNode * 2] = tempValue;
     92                     currentNode = currentNode * 2;
     93                 }
     94                 // 小根堆 + 右子树
     95                 else if(type == Type.MIN && currentNode * 2 + 1 <= size && ((T)node[currentNode * 2 + 1]).compareTo(node[currentNode]) < 0){
     96                     Object tempValue = node[currentNode];
     97                     node[currentNode] = node[currentNode * 2 + 1];
     98                     node[currentNode * 2 + 1] = tempValue;
     99                     currentNode = currentNode * 2 + 1;
    100                 }
    101                 // 大根堆 + 左子树
    102                 else if(type == Type.MAX && currentNode * 2 <= size && ((T)node[currentNode * 2]).compareTo(node[currentNode]) > 0){
    103                     Object tempValue = node[currentNode];
    104                     node[currentNode] = node[currentNode * 2];
    105                     node[currentNode * 2] = tempValue;
    106                     currentNode = currentNode * 2;
    107                 }
    108                 // 大根堆 + 右子树
    109                 else if(type == Type.MAX && currentNode * 2 + 1 <= size && ((T)node[currentNode * 2 + 1]).compareTo(node[currentNode]) > 0){
    110                     Object tempValue = node[currentNode];
    111                     node[currentNode] = node[currentNode * 2 + 1];
    112                     node[currentNode * 2 + 1] = tempValue;
    113                     currentNode = currentNode * 2 + 1;
    114                 }
    115                 else{
    116                     break;
    117                 }
    118         }
    119     }
    120     /**
    121      * 遍历
    122      */
    123     public void traverse(){
    124         for(int i = 1; i <= size; i ++){
    125             System.out.println(node[i]);
    126         }
    127     }
    128     public enum Type {
    129         MIN,
    130         MAX
    131     }
    132 
    133     public static void main(String[] args){
    134         Heap demo = new Heap<Integer>(Type.MIN);
    135         demo.insert(1);
    136         demo.insert(10);
    137         demo.insert(8);
    138         demo.insert(18);
    139         demo.insert(2);
    140         demo.insert(6);
    141         demo.insert(9);
    142         demo.insert(0);
    143         demo.insert(0);
    144         demo.insert(0);
    145         demo.insert(0);
    146         demo.insert(0);
    147         demo.traverse();
    148     }
    149 }
  • 相关阅读:
    自由群(2)|完整版
    模1|同态
    交换代数笔记1|Atiyah,Chpt.1
    微分形式的几何第一章笔记
    矩阵群的一些简单习题1
    自由群1:基本概念
    代数的一些习题2|自由群与自由交换群
    蛤车1:两个习题,群作用与覆叠空间,N-S定理
    提升引理:唯一提升与同伦提升
    复变函数:复函数的空间与Montel定理
  • 原文地址:https://www.cnblogs.com/caiyao/p/9362212.html
Copyright © 2020-2023  润新知