自建堆

这是大顶堆
建堆heapify()和取最大值delMax()都是用的下滤percolateDown()
实现下滤可以借助swap()和properParent()--找到三者中的最大值的秩--可以比较简洁实现。
上滤的话注意循环退出条件要注意parent== pos,避免进入死循环(-1/2==0)
如果换成(pos-1)>>1,即用位运算代替除法可以避免死循环
-1带符号右移后还是-1.但-1/2是0.
右移1位和除2的区别:
区别

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;
    }
}

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)>>1)>=0){
            int parent=(pos-1)>>1;
            if(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;
    }
}
posted @ 2021-05-03 22:40  wsshub  阅读(70)  评论(0)    收藏  举报