Java - 我的二进制堆实现有多好?

时间:2015-02-22 15:07:29

标签: java heap priority-queue

我已经阅读了一些关于二进制堆/优先级队列的内容,并决定尝试自己实现一个。我不是最有经验的程序员,如果你们能看看我的堆类并告诉我它是否是一个很好的实现,我将非常感激。

我可以在这里改进什么?欢迎任何反馈。

public class Heap<T extends Comparable<? super T>> {

    private T[] array = (T[])new Comparable[10];
    private int size = 0;

    public void insert(T data) {
        if(size+1 > array.length) expandArray();

        array[size++] = data;
        int pos = size-1;
        T temp;

        while(pos != 0 && array[pos].compareTo(array[pos/2]) < 0) {
            temp = array[pos/2];
            array[pos/2] = array[pos];
            array[pos] = temp;
            pos /= 2;
        }
    }

    public T deleteMin() {
        T min = array[0];

        array[0] = array[size-1];
        array[size-1] = null;
        size--;
        int pos = 0;
        T temp;
        boolean done = false;

        while(pos*2+1 < size && !done) {
            int minChild = pos*2+1;
            if(array[minChild].compareTo(array[pos*2+2]) > 0) minChild = pos*2+2;

            if(array[pos].compareTo(array[minChild]) > 0) {
                temp = array[minChild];
                array[minChild] = array[pos];
                array[pos] = temp;
                pos = minChild;
            }
            else done = true;
        }

        return min;
    }

    private void expandArray() {
        T[] newArray = (T[])new Comparable[array.length*2];

        for(int i = 0; i < array.length; i++)
            newArray[i] = array[i];

        array = newArray;
    }
}

1 个答案:

答案 0 :(得分:1)

回答问题的最佳方法是编写单元测试来测试您的实现是否可靠,并编写一些性能测试来测试您的实现是否相当快。在完成这两件事的过程中,您还会发现您的实现是否易于使用。