最小优先队列

本文介绍了如何使用Java实现最小优先队列,包括知识储备、编码实现、测试类的详细步骤,并展示了测试结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

package PriorityQueue;

public class minPriorityQueue<T extends Comparable<T>> {
   //存储数据
	private T[] items;
   //记录元素个数
	private int N;
	public minPriorityQueue(int capacity) {
		// TODO Auto-generated constructor stub
		this.items=(T[])new Comparable[capacity+1];
	}
	//判断索引i处的元素是否小于索引j处的元素
	public boolean less(int i,int j){
		return items[i].compareTo(items[j])<0;
	}
	
	//判断队列是否为空
	public boolean isEmpty(){
		return N==0;
	}
	
	//获取队列中元素个数
	public int size(){
		return N;
	}

	//交换索引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 delMin(){
		T min=items[1];
		items[1]=items[N];
		N--;
		sink(1);
		return min;
	}
	
	//使用上浮算法,让处于k索引处的元素在队列中处于正确的位置
	public void swim(int k){
		while(k>1){
			if(less(k,k/2)){
				exch(k,k/2);
			}
			k=k/2;
		}
	}
	
	//下沉算法,让k位置的元素在队列中处于正确的位置
	public void sink(int k){
		while(k*2<=N){
			int min;
			if(k*2+1<=N){
				if(less(k*2+1,k*2)){
					min=k*2+1;
				}else{
					min=k*2;
				}
			}
			else{
				min=k*2;
			}
			if(!less(min,k)){
			   break;
			}
			exch(min,k);
			k=min;
		}
	}
}

3.测试类:

package PriorityQueue;

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值