0
点赞
收藏
分享

微信扫一扫

数据结构优先级队列PriorityQueue

幸福的无所谓 2024-11-26 阅读 27

在这里插入图片描述

数据结构中的优先级队列

优先级队列的概念

如何实现优先级队列?

PriorityQueue优先队列实现

大根堆实现

  //大根堆
    public void siftDown(int parent,int usedSize){
        int child=(2*parent)+1;
       while(child<usedSize) {
           //child最大范围就是usedSize的长度,这里的usedSize为10
           if (child+1<usedSize&&elem[child] < elem[child + 1]) {
               //取得最大值进行比较
               child = child + 1;
           }
           if (elem[child] > elem[parent]) {
               swap(child,parent);
               //parent往下找左右子树如果范围不满足要求,不在进行查找
               parent=child;
               child=(2*parent)+1;
           } else {
               //因为只需要拿到最大值与根节点交换,如果不笔比parent大说明左右树都小,直接跳出循环
               break;
           }
       }
    }
    public void swap(int c,int p){
        int tmp=elem[c];
        elem[c]=elem[p];
        elem[p]=tmp;
    }

小根堆实现

 //小根堆
    public void siftDown(int parent,int usedSize){
        int child=(2*parent)+1;
       while(child<usedSize) {
           //child最大范围就是usedSize的长度,这里的usedSize为10
           if (child+1<usedSize&&elem[child] > elem[child + 1]) {
               //取得最大值进行比较
               child = child + 1;
           }
           if (elem[child] < elem[parent]) {
               swap(child,parent);
               //parent往下找左右子树如果范围不满足要求,不在进行查找
               parent=child;
               child=(2*parent)+1;
           } else {
               //因为只需要拿到最大值与根节点交换,如果不笔比parent大说明左右树都小,直接跳出循环
               break;
           }
       }
    }
    public void swap(int c,int p){
        int tmp=elem[c];
        elem[c]=elem[p];
        elem[p]=tmp;
    }

插入元素

 public void swap(int c,int p){
        int tmp=elem[c];
        elem[c]=elem[p];
        elem[p]=tmp;
    }
    //插入一个元素到栈堆中
    public void push(int val){
        if(isEmpty())throw new RuntimeException("The array element is empty.");
        if(isFull())elem= Arrays.copyOf(elem,2*elem.length);
        elem[usedSize]=val;//将val值给到最后一个位置
        shiftUp(usedSize);
        usedSize++;
    }
    public void siftUp(int child){
    int parent=(child-1)/2;//获取添加的数组最后一个位置的根节点
        while(child>0){
            if(elem[child]>elem[parent]){
                swap(child,parent);
                child=parent;
                parent=(child-1)/2;
            }else{
                break;
            }
        }
    }

删除元素

  public int poll(){
        if(isEmpty())return -1;
        int firstVal=elem[0];
        swap(0,usedSize-1);//0下标与最后一个下标进行更换
        usedSize--;//删除最后一个下标的元素,后续进行覆盖
        siftDown(0,usedSize);
        return firstVal;
    }

堆排序

 public void heapSort(){
        int end=usedSize-1;//最后一个小表
        while(end!=0) {
            swap(0, end);
            siftDown(0,end);
            end--;
        }
    }

PriorityQueue包注意事项

举报

相关推荐

0 条评论