数据结构中的优先级队列
优先级队列的概念
如何实现优先级队列?
PriorityQueue优先队列实现
大根堆实现
//大根堆
public void siftDown(int parent,int usedSize){
int child=(2*parent)+1;
while(child<usedSize) {
//child最大范围就是usedSize的长度,这里的usedSize为10
if (child+1<usedSize&&elem[child] < elem[child + 1]) {
//取得最大值进行比较
child = child + 1;
}
if (elem[child] > elem[parent]) {
swap(child,parent);
//parent往下找左右子树如果范围不满足要求,不在进行查找
parent=child;
child=(2*parent)+1;
} else {
//因为只需要拿到最大值与根节点交换,如果不笔比parent大说明左右树都小,直接跳出循环
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) {
//child最大范围就是usedSize的长度,这里的usedSize为10
if (child+1<usedSize&&elem[child] > elem[child + 1]) {
//取得最大值进行比较
child = child + 1;
}
if (elem[child] < elem[parent]) {
swap(child,parent);
//parent往下找左右子树如果范围不满足要求,不在进行查找
parent=child;
child=(2*parent)+1;
} else {
//因为只需要拿到最大值与根节点交换,如果不笔比parent大说明左右树都小,直接跳出循环
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;//将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);//0下标与最后一个下标进行更换
usedSize--;//删除最后一个下标的元素,后续进行覆盖
siftDown(0,usedSize);
return firstVal;
}
堆排序
public void heapSort(){
int end=usedSize-1;//最后一个小表
while(end!=0) {
swap(0, end);
siftDown(0,end);
end--;
}
}