优先级队列及用java数组实现

优先级队列

所谓优先级队列,其实和普通队列一样,也有一个队首一个队尾,并且也是从队首删除数据。只不过插入的时候不一定是插入到队尾,插入的时候是按照插入排序的算法从队首开始寻找插入位置,因此其中的数据项是按照升序或降序的方式存储在队列中的,如果是升序优先级队列,则具有最小关键字值的数据项拥有最高优先级并放在队首位置。

里面会用到一点插入排序的算法思想!

优先级队列的效率

优先级队列可以用数组实现也可以用堆来实现。一般来说,用堆实现的效率更高。

用数组实现的插入操作需要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);
	}
}

运行结果:


猜你喜欢

转载自blog.csdn.net/ASN_forever/article/details/80885668