• 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 
  • 相关阅读:
    Java提高学习之Object(5)
    cmd命令。
    CacheView。
    快速界面:QML。
    抓包工具。
    打包安装程序。
    AS:加载新版本的SWF文件。
    as自定义菜单。
    as [Frame]元标签
    转载:Flash AS3.0 加载外部资源(图片,MP3,SWF)的两种方式
  • 原文地址:https://www.cnblogs.com/reynold-lei/p/4371180.html
Copyright © 2020-2023  润新知