
数据结构中的优先级队列
优先级队列的概念
如何实现优先级队列?
PriorityQueue优先队列实现
大根堆实现
public void siftDown(int parent,int usedSize){
int child=(2*parent)+1;
while(child<usedSize) {
if (child+1<usedSize&&elem[child] < elem[child + 1]) {
child = child + 1;
}
if (elem[child] > elem[parent]) {
swap(child,parent);
parent=child;
child=(2*parent)+1;
} else {
break;
}
}
}
public void swap(int c,int p){
int tmp=elem[c];
elem[c]=elem[p];
elem[p]=tmp;
}
小根堆实现
public void siftDown(int parent,int usedSize){
int child=(2*parent)+1;
while(child<usedSize) {
if (child+1<usedSize&&elem[child] > elem[child + 1]) {
child = child + 1;
}
if (elem[child] < elem[parent]) {
swap(child,parent);
parent=child;
child=(2*parent)+1;
} else {
break;
}
}
}
public void swap(int c,int p){
int tmp=elem[c];
elem[c]=elem[p];
elem[p]=tmp;
}
插入元素
public void swap(int c,int p){
int tmp=elem[c];
elem[c]=elem[p];
elem[p]=tmp;
}
public void push(int val){
if(isEmpty())throw new RuntimeException("The array element is empty.");
if(isFull())elem= Arrays.copyOf(elem,2*elem.length);
elem[usedSize]=val;
shiftUp(usedSize);
usedSize++;
}
public void siftUp(int child){
int parent=(child-1)/2;
while(child>0){
if(elem[child]>elem[parent]){
swap(child,parent);
child=parent;
parent=(child-1)/2;
}else{
break;
}
}
}
删除元素
public int poll(){
if(isEmpty())return -1;
int firstVal=elem[0];
swap(0,usedSize-1);
usedSize--;
siftDown(0,usedSize);
return firstVal;
}
堆排序
public void heapSort(){
int end=usedSize-1;
while(end!=0) {
swap(0, end);
siftDown(0,end);
end--;
}
}
PriorityQueue包注意事项