最大優(yōu)先隊列 由 二叉堆的最大堆完成。

package shujujiegou.二叉樹;

import java.util.Arrays;
import java.util.PriorityQueue;

/*
最大優(yōu)先隊列 由 二叉堆的最大堆完成。
*/
public class PriorityQueueMax {
private int[] array;
private int size;

public PriorityQueueMax() {
    //隊列初始化長度為32
    this.array  =new int[32];
}

public static void main(String[] args) throws Exception {

    PriorityQueueMax  priorityQueue=new PriorityQueueMax();
    //入隊
    priorityQueue.enQueue(3);
    priorityQueue.enQueue(5);
    priorityQueue.enQueue(10);
    priorityQueue.enQueue(2);
    priorityQueue.enQueue(7);

    System.out.println("出隊元素"+priorityQueue.deQueue());
    System.out.println("出隊元素"+priorityQueue.deQueue());
}



/*
       入隊
 */
private void enQueue(int key) {
    //隊列超出內(nèi)容 擴容
    if (size >=array.length){
        resize();
    }
    array[size++]=key;
    upAdjust();
}

/*
隊列擴容
*/
private void resize() {
//隊列容量翻倍
int newSize=this.size * 2;
this.array= Arrays.copyOf(this.array, newSize);
}

/*
    上沉操作
 */
private void upAdjust() {
    int childrenIndex = array.length-1;
    int parentIndex = (childrenIndex-1)/2;

    //temp保存插入的葉子節(jié)點值,用于最后的賦值。
    int  temp  = array[childrenIndex];

    while (temp >  array[parentIndex] &&  childrenIndex >0){
        //無需真正交換 單向賦值即可
        array[childrenIndex]  =array[parentIndex];
        childrenIndex=parentIndex;
        parentIndex=parentIndex/2;
    }
        array[childrenIndex]=temp;
    System.out.println(Arrays.toString(array));
}
/*
     出隊
 */
private int deQueue() throws Exception {
    if (size<=0){
        throw new Exception("the queue is empty!");
    }
    //獲取堆頂元素
    int head=array[0];

    //讓最后一個元素移動到堆頂
    array[0]=array[--size];
    downAdjust();
    return head;
}

/**
 * 下沉操作
 */
private void downAdjust() {
    int childIndex =1;
    int parentIndex =0;
    //temp保存父節(jié)點的值 用于最后的賦值
    int temp =array[childIndex];

    while (childIndex < size){
        //如果有右孩子 且 右孩子大于左孩子的值 則定位到右孩子
        if (childIndex +1 < size  &&  array[childIndex+1] > array[childIndex]){
            childIndex++;
        }
        //如果父節(jié)點 大于 任何 一個 孩子 的值  直接跳出
        if (temp >= array[childIndex]){
            break;
        }
        array[parentIndex]  =array [childIndex];
        parentIndex =childIndex;
        childIndex = 2* childIndex +1;
    }
    array[parentIndex] =temp;
}

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容