PriorityQueue

优先级队列: PriorityQueue
1、特点:
不能添加null元素
可重复
默认构建的是小顶堆
2、应用场景:
查找数据中前100大的数据;
查找数据中前100小的数据;
3、数据结构:object[ ]数组
大根堆,小根堆
4、底层源码分析:
(1)继承关系:
继承:AbstractQueue
实现: java.io.Serializable
(2)构造函数:

 int newCapacity = ((oldCapacity < 64)?
                           ((oldCapacity + 1) * 2):
                           ((oldCapacity / 2) * 3));
        if (newCapacity < 0) // overflow
            newCapacity = Integer.MAX_VALUE;
        if (newCapacity < minCapacity)
            newCapacity = minCapacity;
        queue = Arrays.copyOf(queue, newCapacity)
      <1.7.....>

(3)基本属性:

Object[] queue;
int DEFAULT_INITIAL_CAPACITY = 11 ;
int size = 0;
Comparator<? super E> comparator;

5、方法:
boolean add (E e) : 调用的offer,
boolean offer(E e) :添加指定元素到优先级队列中, 如果元素为null抛出异常
boolean remove( ) :删除头结点 (父类方法),队列为空,抛出异常
boolean remove(E e) : 删除队列指定元素
E peek(): 获取队列头部元素,但不删除,队列为空,返回null
E element():获取头结点,(父类方法),队列为空,抛出异常
E poll( ) :删除并且返回队列的头部,如果队列为空,返回null

大根堆:

public class MaxHeap {
    int size;
    Node [] arr;

    class Node{
        int val;
        Node (int val) {
            this.val = val;
        }
    }
    
    MaxHeap() {
        arr = new Node[100];
    }
    /*
        将新添的元素放在最后一个位置,然后依次判断此元素和父类元素的大小关系,
        如果新元素大于父节点,二者交换位置,继续比较新元素和新的父节点的大小
        关系,如果新元素的值小于父亲元素,将新元素放当前位置;依次循环,直至
        index>0;
    */
    public void add(int val) {
        if (size==0) {
            arr[size++] = new Node(val);
            return;
        }

        int index = size;
        while (index > 0) {
            //获得父节点
            int father = (index - 1)>>1;
            if (arr[father].val>val) {
                break;
            }
            arr[index] = arr[father];
            index = father;
        }
        arr[index] = new Node(val);
        size++;
    }

//默认删除第一个数据
/*
    默认删除第一个节点:首先得到最后一个节点(temp),然后从首节点位置开始,往下
    找子节点中值最大的(max),拿temp和max比较,如果temp大,就直接放到首节点位置,
    如果max大,将temp和和max交换位置,然后指针向下移动, 依次循环,直至
    index< (size>>>1)

*/
    public void remove () {
        if (size== 0) {
            return;
        }
        int index = 0;
        int val = arr[--size].val;  //获得最后一个值

        while (index < size>>>1) {
            //获得最大的子节点
            int max = (index<<1) +1;
            int right = max +1;
            //此处进行对右孩子下标做越界判断

            if (right<size && arr[right].val>arr[max].val) {
                max = right;
            }
            if (val > arr[max].val) {
                break;
            }
            arr[index].val  = arr[max].val;
            index = max;
        }
        arr[index].val = val;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值