我已经阅读了一些关于二进制堆/优先级队列的内容,并决定尝试自己实现一个。我不是最有经验的程序员,如果你们能看看我的堆类并告诉我它是否是一个很好的实现,我将非常感激。
我可以在这里改进什么?欢迎任何反馈。
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;
}
}
答案 0 :(得分:1)
回答问题的最佳方法是编写单元测试来测试您的实现是否可靠,并编写一些性能测试来测试您的实现是否相当快。在完成这两件事的过程中,您还会发现您的实现是否易于使用。