zoukankan      html  css  js  c++  java
  • 最小堆代码实现

      1 package sort;
      2 
      3 import java.util.ArrayList;
      4 import java.util.List;
      5 
      6 /**
      7  * 最小堆排序
      8  * Created by liuwei on 16/3/7.
      9  */
     10 public class MinHeap {
     11 
     12     private List<Integer> heap = null;
     13 
     14     public  MinHeap(){
     15         heap = new ArrayList<>();
     16     }
     17 
     18     public MinHeap(int[] nums){
     19         heap = new ArrayList<>(nums.length);
     20         for(int i=0; i<nums.length;i++){
     21             heap.add(nums[i]);
     22         }
     23         adjust();
     24     }
     25 
     26     public void addElement(int number){
     27         heap.add(number);
     28 //        adjust();
     29         adjustFromDownToUp();
     30     }
     31 
     32     public int size(){
     33         return heap.size();
     34     }
     35 
     36     public boolean isEmpty(){
     37         for(Integer i : heap){
     38             return false;
     39         }
     40         return true;
     41     }
     42 
     43     public Integer getTop(){
     44         return isEmpty()? null:heap.get(0);
     45     }
     46 
     47     public Integer delTop(){
     48         if(isEmpty()) return null;
     49         int top = heap.remove(0);
     50         if(!isEmpty()){
     51             heap.add(0,heap.get(heap.size()-1));
     52             heap.remove(heap.size()-1);
     53 //            adjust();
     54             adjustFromUpToDown();
     55         }
     56         return top;
     57     }
     58 
     59     private void swap(int i,int j){
     60         int tmp = heap.get(i);
     61         heap.set(i,heap.get(j));
     62         heap.set(j,tmp);
     63     }
     64 
     65     /**
     66      * 全局调整
     67      * */
     68     private void adjust(){
     69         if(size() <= 1) return;
     70         int i = size() - 1;
     71         int parent = 0;
     72         if(i % 2 == 1){
     73             parent = (i -1) / 2;
     74             if(heap.get(i) < heap.get(parent)){
     75                 swap(i,parent);
     76             }
     77             i--;
     78         }
     79         while(i > 0){
     80             parent = (i - 1) / 2;
     81             int value = Math.min(heap.get(i-1),heap.get(i));
     82             if(value < heap.get(parent)){
     83                 if(value == heap.get(i-1)){
     84                     swap(i-1,parent);
     85                 }
     86                 else{
     87                     swap(i,parent);
     88                 }
     89             }
     90             i= i -2;
     91         }
     92     }
     93 
     94     //当删除一个元素的时候,是将最后一个元素,插入到之前第一个元素的位置,该元素后面是有序的,这时候自上向下调整
     95     private void adjustFromUpToDown(){
     96         if(size() < 2) return;
     97         int index = 0;
     98         int left = 2 * index + 1;
     99         int right = 2 * index + 2;
    100         while(index < size() ){
    101             if(right < size()){
    102                 int value = Math.min(heap.get(left),heap.get(right));
    103                 if(value < heap.get(index)){
    104                     if(value == heap.get(left)){
    105                         swap(left,index);
    106                         index = left;
    107                     }
    108                     else{
    109                         swap(right,index);
    110                         index = right;
    111                     }
    112                     left = 2 * index + 1;
    113                     right = 2 * index + 2;
    114                 }
    115                 else{
    116                     return;
    117                 }
    118             }
    119             else if(left < size()){
    120                 if(heap.get(left) < heap.get(index)){
    121                     swap(left,index);
    122                 }
    123                 return;
    124             }
    125             else{
    126                 return;
    127             }
    128         }
    129     }
    130 
    131     //当增加一个元素的时候,是插入到最后一个位置,这时候,前面是有序的,这时候自下而上的调整
    132     private void adjustFromDownToUp(){
    133         if(size() < 2) return;
    134         int index = heap.size() - 1;
    135         int parent = (index - 1) / 2;
    136         if(index % 2 == 1){
    137             if(heap.get(index) < heap.get(parent)){
    138                 swap(index,parent);
    139                 index = parent;
    140             }
    141             else{
    142                 return;
    143             }
    144         }
    145         int left = 0, right = 0;
    146         while(index > 0){
    147             parent = (index - 1)/2;
    148             if(index % 2 == 1){
    149                 left = index;
    150                 right = index + 1;
    151             }
    152             else{
    153                 left = index - 1;
    154                 right = index;
    155             }
    156             int value = Math.min(heap.get(left),heap.get(right));
    157             if(value < heap.get(parent)){
    158                 if(value == heap.get(left)){
    159                     swap(left,parent);
    160                 }
    161                 else{
    162                     swap(right,parent);
    163                 }
    164                 index = parent;
    165             }
    166             else{
    167                 return;
    168             }
    169         }
    170     }
    171 
    172 
    173     public void show(){
    174         for(Integer i : heap){
    175             System.out.print(i+" ");
    176         }
    177         System.out.println();
    178     }
    179 
    180     public static void main(String[] args) {
    181         int[] nums = {9,12,17,30,50,20,60,65,4};
    182         MinHeap heap = new MinHeap();
    183 //        heap.show();
    184 //        heap.addElement(49);
    185 //        heap.show();
    186 //        while(!heap.isEmpty()){
    187 //            System.out.print(heap.delTop()+" ");
    188 //        }
    189 //        System.out.println();
    190 
    191         for(int i=0; i<nums.length;i++){
    192             heap.addElement(nums[i]);
    193 //            heap.show();
    194         }
    195 
    196         while(!heap.isEmpty()){
    197             System.out.print(heap.delTop()+" ");
    198         }
    199         System.out.println();
    200     }
    201 }
  • 相关阅读:
    jmeter接口测试3-正则表达式提取器的使用
    Sublime中Markdown的安装与使用
    python使用you-get模块下载视频
    python BeautifulSoup模块的简要介绍
    python Requests模块的简要介绍
    mongodb基本操作的学习
    python中的常用方法
    网盘的选择,百度网盘、google drive 还是 Dropbox
    python_爬虫一之爬取糗事百科上的段子
    pycharm的使用破解和Anaconda的使用
  • 原文地址:https://www.cnblogs.com/nashiyue/p/5251906.html
Copyright © 2011-2022 走看看