package sort;
import java.util.Arrays;
import java.util.Random;
public class PriorityQueue<T extends Comparable<T>> {
private T[] queue;
private int index; // 记录有效元素的个数
public PriorityQueue(){
this.queue = (T[])new Comparable[10];
}
// 入优先级队列
public void push(T val){
if(full()){
this.queue = Arrays.copyOf(queue, queue.length*2);
}
if(index == 0){
queue[index] = val;
} else {
siftUp(index, val); // 新插入的元素,要进行堆的上浮操作
}
index++;
}
/**
* 堆的上浮函数
* @param i
* @param val
*/
private void siftUp(int i, T val) {
while(i > 0){
int j = (i-1)/2;
if(queue[j].compareTo(val) < 0){
queue[i] = queue[j];
i = j;
} else {
break;
}
}
queue[i] = val;
}
// 出优先级队列
public T pop(){
if(empty())
return null;
T oldval = queue[0];
--index;
if(index > 0){
siftDown(0, queue[index]); // 删除元素,进行堆的下沉操作
}
return oldval;
}
/**
* 堆的下沉函数
* @param i
* @param val
*/
private void siftDown(int i, T val) {
for(int j=2*i+1; j<index; j=j*2+1){
if(j+1 < index && queue[j+1].compareTo(queue[j]) > 0){
j++;
}
if(queue[j].compareTo(val) > 0){
queue[i] = queue[j];
i = j;
} else {
break;
}
}
queue[i] = val;
}
boolean full(){
return index == queue.length;
}
boolean empty(){
return index == 0;
}
public static void main(String[] args) {
PriorityQueue<Integer> que = new PriorityQueue<>();
Random rd = new Random();
for (int i = 0; i < 20; i++) {
que.push(rd.nextInt(100));
}
while(!que.empty()){
System.out.print(que.pop() + " ");
}
System.out.println();
}
}
优先级队列的代码实现
最新推荐文章于 2024-09-10 13:29:46 发布