优先级队列
所谓优先级队列,其实就是队列的数据项是按顺序存储的,和普通队列很类似,也有一个队首一个队尾,并且也是从队首删除数据。只不过插入的时候不一定是插入到队尾(因为要维持队列的有序性)。
优先级队列一般有数组和堆两种数据结构实现方式,下面介绍的是数组形式以插入排序算法实现的优先级队列。
优先级队列的效率
优先级队列可以用数组实现也可以用堆来实现。一般来说,用堆实现的效率更高。
用数组实现的插入操作需要O(N)的时间,删除需要O(1)的时间。
java实现(升序)
public class PriorityQueue {
public static void main(String[] args) {
PrioQueue pq = new PrioQueue(4);
pq.push(2);
pq.push(1);
pq.push(5);
pq.push(3);
pq.push(4);
pq.pop();
pq.pop();
pq.push(1);
pq.pop();
pq.push(6);
pq.pop();
pq.pop();
}
}
class PrioQueue{
private int size,countElem=0;
private int[] arr;
public PrioQueue(int size){
this.size = size;
this.arr = new int[size];
}
public void push(int num){
if(!isFull()){
//相当于插入排序的步骤(降序)
if(countElem!=0){
int i = countElem - 1;
for(;i>=0;){
if(num>=arr[i]){
arr[i+1]=arr[i];
i--;
}else {
break;
}
}
arr[i+1] = num;
countElem++;
System.out.println("插入元素:"+num);
}else{
arr[0] = num;
countElem=1;
System.out.println("当前队列为空,插入第一个元素:"+num);
}
getQueue();
}
}
public void pop(){
int front = countElem-1;
if(!isEmpty()){
System.out.println("删除队首元素:"+arr[front--]);
countElem--;
getQueue();
}
}
public void getQueue(){
for(int i=0;i<countElem;i++){
System.out.print(arr[i]+" ");
}
System.out.println();
}
public boolean isEmpty(){
if(countElem==0){
System.out.println("队列为空!!!");
return true;
}else{
return false;
}
}
public boolean isFull(){
if(countElem==size){
System.out.println("队列已满!!!");
getQueue();
return true;
}else{
return false;
}
}
}
运行结果:
官方实现:
public class PriorityQ {
public static void main(String[] args) {
PriorityQTool p = new PriorityQTool(5);
p.insert(30);
p.insert(50);
p.insert(10);
p.insert(40);
p.insert(20);
while(!p.isEmpty()){
long item = p.remove();
System.out.print(item+" ");
}
System.out.println("");
}
}
class PriorityQTool{
private int maxSize;
private long[] queArray;
private int nItems;
public PriorityQTool(int s){
maxSize = s;
queArray = new long[maxSize];
nItems = 0;
}
public void insert(long item){
int j;
if(nItems==0){
queArray[nItems++] = item;
}else{
for(j=nItems-1;j>=0;j--){
if(item>queArray[j]){
queArray[j+1] = queArray[j];
}else {
break;
}
}
queArray[j+1] = item;
nItems++;
}
}
public long remove(){
return queArray[--nItems];
}
public long peekMin(){
return queArray[nItems-1];
}
public boolean isEmpty(){
return (nItems==0);
}
public boolean isFull(){
return (nItems==maxSize);
}
}
运行结果: