最大堆实现

时间:2016-10-05 17:18:18

标签: java heap max-heap

我应该对Java中的以下MaxHeap实现做出哪些更正?Insert函数在调用时保持运行。 Insert和BuildHeap函数中的错误是什么?我编辑了PercolateDown函数。我认为现在应该是正确的。?

public class MaxHeap {
    public int[] array;
    public int count;
    public int capacity;
    public MaxHeap(int capacity){
        this.capacity=capacity;
        this.count=0;
        this.array=new int[capacity];
    }
    public int Parent(int i){
        if(i<=0 || i>=this.count)
            return -1;
        return
                (i-1)/2;
    }
    public int LeftChild(int i){
        int left=2*i+1;
        if(left>=this.count)
            return -1;
        return left;
    }
    public int RightChild(int i){
        int right=2*i+2;
        if(right>=this.count)
            return -1;
        return right;
    }
    public int GetMaximum(){
        if(this.count==0)
            return -1;
        return this.array[0];
    }
    public void PercolateDown(int i){
        int l,r,max,temp;
        l=LeftChild(i);
        r=RightChild(i);
        if(l!=-1 && this.array[l]>this.array[i])
            max=l;
        else
            max=i;
        if(r!=-1 && this.array[r]>this.array[max])
            max=r;
        if(max!=i){
            temp=this.array[i];
            this.array[i]=this.array[max];
            this.array[max]=temp;
        }
        if(max==i){return;}
        PercolateDown(max);
    }
    public int DeleteMax(){
        if(this.count==0)
            return -1;
        int data=this.array[0];
        this.array[0]=this.array[this.count-1];
        this.count--;
        PercolateDown(0);
        return data;
    }
    public void Insert(int data){
        int i;
        if(this.count==this.capacity){
            ResizeHeap();
        }
        this.count++;
        i=this.count-1;
        while(i>=0 && data>this.array[(i-1)/2]){
            this.array[i]=this.array[(i-1)/2];
            i=(i-1)/2;

        }
        this.array[i]=data;
    }
        public void ResizeHeap(){
            int[] array_old=new int[this.capacity];
            for(int i=0;i<this.capacity;i++){
                array_old[i]=this.array[i];
            }
            this.array=new int[this.capacity*2];
            for(int i=0;i<this.capacity;i++){
                this.array[i]=array_old[i];
            }
            this.capacity*=2;
            array_old=null;

    }
        public static MaxHeap BuildHeap(int[]A,int n){
            MaxHeap h=new MaxHeap(n*2);
            if(A==null)return h;
            //while(n>h.capacity)
                //h.ResizeHeap();
            h.capacity=n*2;
            for(int i=0;i<n;i++){
                h.array[i]=A[i];
            }
            h.count=n;
            for(int i=(n/2)-1;i>=0;i++){
                h.PercolateDown(i);
            }
            return h;
    }
        public void Delete(int i){          
            if(this.count<i){
                System.out.println("Wrong Position");
                return;
            }
            this.array[i]=this.array[this.count-1];
            this.count--;
            PercolateDown(i);

        }

        public static void main(String[] args){
            //int[] A={7,6,5,4,3,2,1};
            //int len=A.length;
            //MaxHeap h=BuildHeap(A,len);
            //for(int i=0;i<len;i++){
                //System.out.print(h.array[i]+" ");
            //}
            MaxHeap h=new MaxHeap(10);
            h.Insert(7);
            System.out.print(h.array[0]);
        }
}

1 个答案:

答案 0 :(得分:0)

我在Insert()中的while循环中插入了这个语句:

        System.out.println(i);

每次都打印0。由于0> = 0并且你的数组中也带有0,所以当数据是7和7时, 0,while条件为真。在你的循环中,你将i设置为(i - 1) / 2,这是-1 / 2,它向零舍入,再次产生0。所以i没有改变,你的状态仍然是真的。这就是你的循环永不停止的原因。我不明白你的方法是如何工作的,所以我不敢提出建议。

BuildHeap()的for循环中尝试相同的print语句会显示我一直在增加,直到它溢出并且突然是负数(如果你将一个加到你可以拥有的最高int,你得到最低的负数价值,-2147483648)。我认为您在i--中打算i++而不是for(int i=(n/2)-1;i>=0;i++){