优先级队列Java实现

◼ 优先级队列也是个队列,因此也是提供以下接口
◼ int size(); // 元素的数量
◼ boolean isEmpty(); // 是否为空
◼ void enQueue(E element); // 入队
◼ E deQueue(); // 出队
◼ E front(); // 获取队列的头元素
◼ void clear(); // 清空
◼ 普通的队列是 FIFO 原则,也就是先进先出
◼ 优先级队列则是按照优先级高低进行出队,比如将优先级最高的元素作为队头优先出队

优先队列的底层实现
◼ 根据优先队列的特点,很容易想到:可以直接利用二叉堆作为优先队列的底层实现
◼ 可以通过 Comparator 或 Comparable 去自定义优先级高低

在这里插入图片描述

Java官方的优先级队列priorityQueue底层是用最小堆实现的,详情可以看他的下滤和上滤操作。因此调用其poll方法,返回结果是该队列中最小的元素。如果你自己给他传进去一个比较器,就按照比较器进行优先级比较。

Java官方的一个上滤方法

private static <T> void siftUpComparable(int k, T x, Object[] es) {
        Comparable<? super T> key = (Comparable<? super T>) x;
        while (k > 0) {
            int parent = (k - 1) >>> 1;
            Object e = es[parent];
            if (key.compareTo((T) e) >= 0)
                break;
            es[k] = e;
            k = parent;
        }
        es[k] = key;
    }

以下为优先级队列的简单实现(底层使用二叉堆)

package mj.queue;

import java.util.Comparator;

//import com.mj.heap.BinaryHeap;
import mj.heap.BinaryHeap;

public class PriorityQueue<E> {
	private BinaryHeap<E> heap;
	
	public PriorityQueue(Comparator<E> comparator) {
		heap = new BinaryHeap<>(comparator);  //将比较器传给二叉堆
	}
	
	public PriorityQueue() {
		this(null);
	}
	
	public int size() {
		return heap.size();
	}

	public boolean isEmpty() {
		return heap.isEmpty();
	}
	
	public void clear() {
		heap.clear();
	}

	public void enQueue(E element) {
		heap.add(element);
	}

	public E deQueue() {
		return heap.remove();
	}

	public E front() {
		return heap.get();
	}
}

二叉堆供参考的实现代码点此进入

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值