首页 > 其他 > 详细

自建堆

时间:2021-05-04 10:08:31      阅读:18      评论:0      收藏:0      [点我收藏+]

这是大顶堆
建堆heapify()和取最大值delMax()都是用的下滤percolateDown()
实现下滤可以借助swap()和properParent()--找到三者中的最大值的秩--可以比较简洁实现。
上滤的话注意循环退出条件要注意parent==pos,避免进入死循环

class Heap{
    int data[];
    int size;
    int capacity;
    Heap(int[] data){
        this.data=data;
        size=data.length;
        heapify();
    }
    Heap(int n){
        capacity=n;
        size=0;
        data=new int[n];
    }
    void  insert(int num){
        if(size==capacity)return;
        data[size]=num;
        size++;
        percolateUp(size-1);
    }
    int delMax(){
        if(size==0)return -1;
        int max=data[0];
        data[0]=data[size-1];
        size--;
        percolateDown(0);
        return max;
    }
    void heapify(){
       for(int i=(size-2)/2;i>=0;i--){
           percolateDown(i);
       }
    }
    int properParent(int i,int j,int k){
        int maxPos=i;
        if(j<size&&data[j]>data[maxPos])
               maxPos=j;
        if(k<size&&data[k]>data[maxPos])
               maxPos=k;
        return maxPos;
    }
    //下滤
    int percolateDown(int pos){//对秩为pos的节点进行下滤
         int j;
      while(pos!=(j=properParent(pos,pos*2+1,pos*2+2))){
          swap(pos,j);//交换前j对应三者中最大的元素,交换后j对应原来pos对应的值;
          pos=j;
      }
      return pos;
    }
    //上滤
    int percolateUp(int pos){
        while((pos-1)/2>=0){
            int parent=(pos-1)/2;
            if(parent==pos||data[parent]>data[pos])
                break;
            swap(parent,pos);
            pos=parent;
        }
        return pos;
    }

    void swap(int i,int j){
        int temp=data[i];
        data[i]=data[j];
        data[j]=temp;
    }
}

自建堆

原文:https://www.cnblogs.com/wsshub/p/14728424.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!