最大优先队列

22 篇文章 0 订阅
7 篇文章 0 订阅

1.知识储备:
在这里插入图片描述
2.编码实现:

package PriorityQueue;

public class maxPriorityQueue<T extends Comparable<T>>{
   //存储堆中的元素
	private T[] items;
	//记录堆中元素个数
	private int N;
	public maxPriorityQueue(int capacity) {
		// TODO Auto-generated constructor stub
		this.items=(T[])new Comparable[capacity+1];  //+1是为了废除0索引
	}
	
	//获取队列中元素个数
	public int size(){
		return N;
	}
	
	//判读队列是否为空
	public boolean isEmpty(){
		return N==0;
	}
	
	//判读队列i处索引值是否小于j处索引值
	public boolean less(int i,int j){
		return items[i].compareTo(items[j])<0;
	}
	
	//交换队列中i索引处和j索引处的值
	public void exch(int i,int j){
		T temp=items[i];
		items[i]=items[j];
		items[j]=temp;
	}
	
	//往堆中插入一个元素
	public void insert(T t){
		items[++N]=t;
		swim(N);
	}
	
	//删除堆中的最大元素,并返回这个最大元素
	public T delMax(){
		T max=items[1];
		items[1]=items[N];
		N--;
		sink(1);
		return max;
	}
	
	//使用上浮算法,使索引k处的元素能在堆中处于一个正确的位置
	private void swim(int k){
		while(k>1){
			if(less(k/2,k)){
				exch(k/2,k);
			}
			k=k/2;
		}
	}
	
	//使用下沉算法,使索引k处的元素能在堆中处于一个正确的位置
	private void sink(int k){
		while(2*k<=N){
			int max;
			if(2*k+1<=N){
				if(less(2*k,2*k+1)){
					max=2*k+1;
				}
				else{
					max=2*k;
				}
			}
			else{
				max=2*k;
			}
			if(less(k,max)){
				exch(k,max);
				k=max;
			}
			else{
				break;
			}
		}
	}
}

3.测试类:

package PriorityQueue;

public class maxPriorityQueueTest {
    public static void main(String[] args) {
		//创建队列
    	maxPriorityQueue<String> queue =new maxPriorityQueue<String>(10);
    	//插入元素
    	queue.insert("A");
    	queue.insert("D");
    	queue.insert("G");
    	queue.insert("B");
    	queue.insert("H");
    	queue.insert("C");
    	queue.insert("E");
    	queue.insert("F");
    	//循环删除
    	while(!queue.isEmpty()){
    		String value=queue.delMax();
    		System.out.print(value+" ");
    	}
	}
}

4.测试结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值