public class MaxHeap<E extends Comparable<E>> {
private Array<E> data;
public MaxHeap(int capacity) {
data=new Array<>(capacity);
}
public MaxHeap() {
data=new Array<>();
}
public int size(){
return data.getSize();
}
public boolean isEmpty(){
return data.isEmpty();
}
private int parent(int index){
if (index == 0)
throw new IllegalArgumentException("index 0 ");
return (index-1)/2;
}
private int leftChild(int index){
return index*2+1;
}
private int rightChild(int index){
return index*2+2;
}
}
複製代碼
public E extractMax(){
E ret =findMax();
data.swap(0,data.getSize()-1);
data.removeLast();
siftDown(0);
return ret;
}
private void siftDown(int k) {
while(leftChild(k)<data.getSize()){
int j=leftChild(k);
if (j+1<data.getSize()&&data.get(j+1).compareTo(data.get(j))>0)
j++;
// data[j] 是左右孩子中的最大值
//data[j] he data[k] compare
if (data.get(k).compareTo(data.get(j))>=0)
break;
data.swap(k,j);
k=j;
}
}
複製代碼
public E replace(E e){
E ret=findMax();
data.set(0,e);
siftDown(0);
return ret;
}
複製代碼
public MaxHeap(E[] arr){
data=new Array<E>(arr);
for (int i=parent(data.getSize()-1);i>=0;i--){
siftDown(i);
}
}
複製代碼
優先隊列能夠基於上面咱們本身實現的最大堆實現java
public class PriorityQueue<E extends Comparable<E>> implements Queue<E>{
private MaxHeap<E> maxHeap;
public PriorityQueue() {
maxHeap=new MaxHeap<>();
}
@Override
public int getSize() {
return maxHeap.size();
}
@Override
public boolean isEmpty() {
return maxHeap.isEmpty();
}
@Override
public void enqueue(E e) {
maxHeap.add(e);
}
@Override
public E dequeue() {
return maxHeap.extractMax();
}
@Override
public E getFront() {
return maxHeap.findMax();
}
}
複製代碼
是最小堆,並且增長了許多新的特性。好比能夠在構造方法傳入Comparator比較器。api