zoukankan      html  css  js  c++  java
  • implement min heap

     1 class MinHeap{
     2     private ArrayList<Integer> arr;
     3     private int DEFAULT_LEN = 10;
     4     public MinHeap(){
     5         arr = new ArrayList<Integer>(DEFAULT_LEN);
     6     }
     7 
     8 //Use an existing array to build min heap
     9     public MinHeap(ArrayList<Integer> input){
    10         this.arr = input;
    11         buildMinHeap();
    12     }
    13     
    14     public MinHeap(int[] input){
    15         arr = new ArrayList<Integer>();
    16         for(int i = 0; i < input.length; i ++){
    17             arr.add(input[i]);
    18         }
    19         buildMinHeap();
    20     }
    21 
    22 //由于需要维持完全二叉树的形态,需要先将要插入的结点x放在最底层的最右边,插入后满 足完全二叉树的特点; 
    23 //然后把x依次向上调整到合适位置满足堆的性质.
    24 //时间:O(logn)。  “结点上浮” 
    25     public void insert(int val){//bot - top
    26         arr.add(val);
    27         botupModifyHeap(arr.size() - 1);
    28     }
    29 
    30 //当删除顶点的数值时,原来的位置就会出现一个孔,填充这个孔的方法就是, 
    31 //把最后的叶子的值赋给该孔并下调到合适位置,然后该叶子删除。 
    32     public int deleteTop(){//top - bot
    33         int result = arr.get(0);
    34         arr.set(0, arr.get(arr.size() - 1));
    35         arr.remove(arr.size() - 1);
    36         upbotModifyHeap(0);
    37         return result;
    38     }
    39 
    40     public int swapTop(int val){
    41         int result = arr.get(0);
    42         arr.set(0, val);
    43         upbotModifyHeap(0);
    44         return result;
    45     }
    46 
    47     @Override
    48     public String toString(){
    49         StringBuilder sb = new StringBuilder();
    50         for(int i = 0; i < arr.size(); i ++){
    51             sb.append(arr.get(i) + " ");
    52         }
    53         return sb.toString();
    54     }
    55 
    56 
    57     private void buildMinHeap(){
    58         for(int i = arr.size() / 2 - 1; i > -1; i --){//bottom-up build min heap
    59             upbotModifyHeap(i);
    60         }
    61     }
    62 
    63     private void upbotModifyHeap(int curIndex){//top-bot modify min heap
    64         int left = curIndex * 2 + 1;
    65         int right = curIndex * 2 + 2;
    66         int smallest = curIndex;
    67         if(left < arr.size() && arr.get(left) < arr.get(smallest))
    68             smallest = left;
    69         if(right < arr.size() && arr.get(right) < arr.get(smallest))
    70             smallest = right;
    71         if(smallest != curIndex){
    72             swap( smallest, curIndex);
    73             upbotModifyHeap(smallest);
    74         }
    75     }
    76 
    77     private void botupModifyHeap(int curIndex){//bottom-up modify min heap
    78         if(curIndex == 0) return;
    79         int parentIndex = curIndex / 2;
    80         if(arr.get(parentIndex) > arr.get(curIndex)){
    81             swap(parentIndex,curIndex);
    82             botupModifyHeap(parentIndex);
    83         }
    84     }
    85 
    86     private void swap(int aa, int bb){
    87         int tmp = arr.get(aa);
    88         arr.set(aa, arr.get(bb));
    89         arr.set(bb, tmp);
    90     }
    91 }

    Test case:

    int[] input = new int[]{7,8,9,10,11,12};

    MinHeap minHeap = new MinHeap(input);
    //        System.out.println(minHeap);
            for(int i = 0; i < input.length; i ++){
                minHeap.insert(i + 1);
                System.out.print(minHeap.deleteTop() + " ");
            }
            for(int i = 0; i < input.length; i ++){
                System.out.print(minHeap.deleteTop() + " ");
            }
    
    
    
    Output:
    1 2 3 4 5 6 7 8 9 10 11 12 
            MinHeap m2 = new MinHeap();
            int[] i2 = new int[]{4,7,9,3,6,5,1,2,8};
            for(int i = 0; i < i2.length; i ++)
                m2.insert(i2[i]);
            for(int i = 0; i < i2.length; i ++)
                System.out.print(m2.deleteTop() + " ");
    
    
    Output:
    1 2 3 4 5 6 7 8 9 
  • 相关阅读:
    LeetCode OJ 107. Binary Tree Level Order Traversal II
    LeetCode OJ 116. Populating Next Right Pointers in Each Node
    LeetCode OJ 108. Convert Sorted Array to Binary Search Tree
    LeetCode OJ 105. Construct Binary Tree from Preorder and Inorder Traversal
    LeetCode OJ 98. Validate Binary Search Tree
    老程序员解Bug的通用套路
    转载 四年努力,梦归阿里,和大家聊聊成长感悟
    转载面试感悟----一名3年工作经验的程序员应该具备的技能
    Web Service和Servlet的区别
    关于spring xml文件中的xmlns,xsi:schemaLocation
  • 原文地址:https://www.cnblogs.com/reynold-lei/p/4371180.html
Copyright © 2011-2022 走看看