优先级队列
所谓优先级队列,其实和普通队列一样,也有一个队首一个队尾,并且也是从队首删除数据。只不过插入的时候不一定是插入到队尾,插入的时候是按照插入排序的算法从队首开始寻找插入位置,因此其中的数据项是按照升序或降序的方式存储在队列中的,如果是升序优先级队列,则具有最小关键字值的数据项拥有最高优先级并放在队首位置。
里面会用到一点插入排序的算法思想!
优先级队列的效率
优先级队列可以用数组实现也可以用堆来实现。一般来说,用堆实现的效率更高。
用数组实现的插入操作需要O(N)的时间,删除需要O(1)的时间。
java实现
下面是自己写的java实现,较为复杂,后面会贴出书上的代码!(升序)
public class PriorityQueue {
public static void main(String[] args) {
PrioQueue pq = new PrioQueue(4);
pq.push(1);
pq.push(2);
pq.push(3);
pq.push(4);
pq.push(5);
pq.pop();
pq.getQueue();
pq.pop();
pq.getQueue();
pq.push(1);
pq.getQueue();
pq.pop();
pq.getQueue();
pq.push(5);
pq.getQueue();
pq.pop();
pq.pop();
pq.pop();
pq.pop();
pq.push(5);
}
}
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){
for(int i=countElem-1;i>=0;i--){
if(num>=arr[i]&&i!=0){
arr[i+1]=arr[i];
}else if(num>arr[i]&&i==0){
arr[i+1]=arr[i];
arr[0] = num;
countElem++;
System.out.println("插入的元素是:"+num);
}
else if(num<arr[i]&&i!=0){
arr[i+1]=num;
countElem++;
System.out.println("插入的元素是:"+num);
}
}
}else{
arr[0] = num;
countElem++;
System.out.println("当前队列为空,插入第一个元素:"+num);
}
}
}
public void pop(){
int front = countElem-1;
if(!isEmpty()){
System.out.println("删除队首元素:"+arr[front--]);
countElem--;
if(countElem==0){
System.out.println("当前队列为空!!!");
}
}
}
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("队列已满!!!");
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);
}
}
运行结果: