优先队列(Java)

优先队列基于最大堆数据结构,提供最高优先级元素优先出队的特性。最大堆要求根节点的值大于或等于其子节点。常用方法包括replace(替换最大元素)和heapify(构建最大堆)。replace可通过extractMax后再add实现,或直接替换后执行Sift Down操作;heapify可将数组逐个插入空堆,或通过特定算法快速构造最大堆。
摘要由CSDN通过智能技术生成

优先队列(底层结构为最大堆)

普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。在优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。优先队列具有最高级先出 (first in, largest out)的行为特征。通常采用堆数据结构来实现。
优先队列主要是出队操作与普通队列不同,队列中元素会有优先级之分,每次出队的元素是优先级最高的元素。

最大堆(二叉堆)

最大堆是堆的两种形式之一。
根结点(亦称为堆顶)的关键字是堆里所有结点关键字中最大者,称为大根堆,又称最大堆(大顶堆)。
大根堆要求根节点的关键字既大于或等于左子树的关键字值,又大于或等于右子树的关键字值。

Arr.java(动态数组)

//动态数组
public class Arr<E> {
   
	private E[] data;// 创建一个数组
	private int size;// 数组中元素个数

	// 自定义构造器初始化数组 capacity数组的长度
	public Arr(int capacity) {
   
		// TODO Auto-generated constructor stub
		data = (E[]) new Object[capacity];
		size = 0;
	}

	// 默认构造方法 capacity数组的长度=10
	public Arr() {
   
		// TODO Auto-generated constructor stub
		this(10);
	}

	// 根据传来的数组生成动态数组
	public Arr(E[] arr) {
   
		data = (E[]) new Object[arr.length];
		for (int i = 0; i < arr.length; i++) {
   
			data[i] = arr[i];
		}
		size = arr.length;
	}

	// 获取数组个数
	public int getSize() {
   
		return size;
	}

	// 获取数组长度
	public int getCapacity() {
   
		return data.length;
	}

	// 判断数组是否为空
	public boolean isEmpty() {
   
		return size == 0;
	}

	// 数组中添加元素 index是插入元素的位置,e是插入的元素,时间复杂度为O(n)
	public void add(int index, E e) {
   
		if (index < 0 || index > size) {
   
			try {
   
				throw new Exception("数组排列要求不能有空");
			} catch (Exception e1) {
   
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
		}
		// 数组扩容
		if (size == data.length) {
   
			try {
   
				resize(2 * data.length); // 这里是扩容为原数组的2倍,Arraylist是扩容1.5倍
			} catch (Exception e1) {
   
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
		}
		for (int i = size - 1; i >= index; i--) {
   
			data[i + 1] = data[i];
		}
		data[index] = e;
		size++;
	}

	// 数组扩容或者缩容,时间复杂度为O(n)
	private void resize(int newcapcatity) {
   
		// TODO Auto-generated method stub
		E[] newData = (E[]) new Object[newcapcatity];
		for (int i = 0; i < size; i++) {
   
			newData[i] = data[i];
		}
		data = newData;
	
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值