优先队列(底层结构为最大堆)
普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。在优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。优先队列具有最高级先出 (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;