zoukankan      html  css  js  c++  java
  • 自定义最大优先队列

    /**
     * @desc: 最大优先队列,值越大,优先级越高,其实就是构造大顶堆
     * @author: 毛会懂
     * @create: 2021-01-06 16:32:00
     **/
    public class MyMaxPriorityQueue<T extends Comparable<T>> {
        private T[] arr;
        private Integer size;
    
        public MyMaxPriorityQueue(Integer size){
            arr = (T[])new Comparable[size];
            this.size = 0;
        }
    
        //队列是否为空
        public Boolean isEmpty(){
            return size == 0;
        }
    
        //队列的大小
        public Integer getSize(){
            return size;
        }
    
        //插入元素
        public void add(T t){
            //插入到数组的末尾(数组的第0个元素不存储,方便元素的上浮和下沉)
            arr[++size] = t;
            //上浮
            swim(size);
        }
    
        //删除最大元素
        public T delMax(){
            if(size == 0){
                return null;
            }
            T t = arr[1];
            //最大的元素(第1个位置)和最后一个元素做交换
            exec(1,size);
            size--;
            //下沉第一个位置的元素
            sink(1);
            return t;
        }
    
        //上浮
        public void swim(Integer k){
            while (k > 1){
                if(great(k,k/2)){
                    exec(k,k/2);
                }
                k = k /2;
            }
        }
    
    
        //下沉
        public void sink(Integer k){
            while (2 * k <= size){
                int max;
                if(2 * k + 1 <= size) {
                    if (great(2 * k, 2 * k + 1)) {
                        max = 2 * k;
                    } else {
                        max = 2 * k + 1;
                    }
                }else{
                    max = 2 * k;
                }
                if(great(max,k)){
                    exec(max,k);
                }
                k = max;
            }
        }
    
        //比较两个元素的大小(arr[i]大,返回True)
        private Boolean great(int i,int j){
            return arr[i].compareTo(arr[j]) > 0;
        }
    
        //交换两个元素位置
        private void exec(int i,int j){
            T t = arr[i];
            arr[i] = arr[j];
            arr[j] = t;
        }
    }

    测试代码:

    //最大优先队列
    public static void main(String[] args) {
    char[] chars = {'A','H','D','O','E','W','G','T'};
    MyMaxPriorityQueue<Character> myHeap = new MyMaxPriorityQueue<>(20);
    for(int i = 0;i < chars.length;i++){
    myHeap.add(chars[i]);
    }

    System.out.println("---------");

    for(int i = 0;i < chars.length;i++){
    System.out.print(myHeap.delMax() + ", ");
    }
    System.out.println("over");
    }
  • 相关阅读:
    FPGA中亚稳态相关问题及跨时钟域处理
    异步FIFO---Verilog实现
    关于 FPGA 内部信号扇入扇出
    使用Xilinx IP核进行PCIE开发学习笔记
    aurora 64B/66B ip核设置与例程代码详解
    Verilog设计Valid-Ready握手协议
    【待写Java线程之线程终止 Interrupt 】
    【数据结构*转】斐波那契数列
    【数据结构】二分查找
    【待完善】资料记录
  • 原文地址:https://www.cnblogs.com/maohuidong/p/14245956.html
Copyright © 2011-2022 走看看