演算法導論學習筆記——最大優先順序隊列

來源:互聯網
上載者:User
/** * 最大優先順序隊列,例如:在一台分時電腦上進行作業高度。這種隊列對要執行的各作業及它們之間的相對優先關係加以記錄 * 當一個作業做完或被中斷時,用extractMax操作從所有等待的作業中,選擇出具有最高優先順序的作業;一個新作業則可以調用insert排入佇列 */public class PriorQueue {    int heapSize = 0;    /**     * 返回arr中最大關鍵字的元素,並在堆中刪除,然後重新調整成最大堆     * @param arr     */    int extractMax(int arr[]){        if(heapSize<1)            System.out.println("");        int max = arr[0];        arr[0] = arr[heapSize-1];        heapSize--;        //調用堆排序(HeapSort)中的方法把堆重新調整為最大堆        maxHeap(arr,1,heapSize);        return max;    }    /**     * 將堆中i位置的關鍵字增加到key,這裡的key不能小於i位置原來的關鍵字大小     * @param arr     * @param i     * @param key     */    void increaseKey(int arr[],int i,int key){        if(key<arr[i-1])            System.out.println("");        arr[i-1] = key;        while(i>1&&arr[i/2-1]<arr[i-1]){            int temp = arr[i/2-1];            arr[i/2-1] = arr[i-1];            arr[i-1] = temp;            i = i/2;        }    }    /**     * 向堆中插入一個新的元素key     * @param arr     * @param key     */    void insert(int arr[],int key){        this.heapSize++;        arr[heapSize-1] = Integer.MIN_VALUE;        this.increaseKey(arr, heapSize, key);    }    //把堆重新調整為最大堆    void maxHeap(int arr[],int i,int heapsize){        int largest = i;        int p = 2*i;        int q = 2*i + 1;        //由於i和heapsize都是指的元素在堆中的位置而非在數組中的位置,所以涉及到數組操作時都要減1        if(p<=heapsize&&arr[p-1]>arr[largest-1])            largest = p;        if(q<=heapsize&&arr[q-1]>arr[largest-1])            largest = q;        if(largest!=i){            int temp = arr[i-1];            arr[i-1]=arr[largest-1];            arr[largest-1]=temp;            //儘管i的左右孩子已經是最大堆,但是當前面的調整發生以後,其左右孩子就有可能不再是最大堆了,所以要重新調整成最大堆            maxHeap(arr,largest,heapsize);        }    }    //測試.....    public static void main(String[] args) {        int arr[]=new int[20];        PriorQueue prior = new PriorQueue();        for(int i =1;i<16;i++ )            prior.insert(arr, i);        for(int j =0;j<prior.heapSize;j++)            System.out.println(arr[j]);        for(int j = 1;j<6;j++)            System.out.println(prior.extractMax(arr));        prior.increaseKey(arr, 2, 20);        System.out.println(prior.extractMax(arr));    }}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.