設初始序列為:(49,38,65,97,76)
①大根堆:父節點的值大於或等於子節點的值(令數值越大優先順序越高)
此時堆頂的元素為所有元素的最大值(97)
②小根堆:父節點的值小於或等於子節點的值(令數值越小優先順序越高)
此時堆頂的元素為所有元素的最小值(38)
將佇列中的所有元素按從大到小的數值輸出:
①分析: 因為佇列是先進先出,後進後出,所以每次出隊的為隊頭元素即堆頂元素queue==>基於大根堆實現;
②思路如下:
1>將入隊的元素進行上浮操作,將最大值放置到堆頂(剩下的數沒有順序)
public void siftup(int i,t val) else
}queue[i]=val; //此時找到val的合適插入位置
}
2>此時出隊的元素(堆頂元素)則為所有值中的最大值,將queue出隊,接下來需要出第二小的元素,由於剩下的資料是沒有順序的,所以利用下沉函式將剩下資料中的最大值放至堆頂
3>將隊尾元素放置堆頂,並與其子節點進行比較,找出最大值放至父節點,並從最大值的位置繼續往下找非葉子節點
for (int j=2*i+1;j0)
if (queue[j].compareto(val)>0)
else
}queue[i]=val; //將val放置合適的位置
此時已經將最大值放置堆頂,出隊元素為值第二大的數
將佇列中的所有元素按從小到大的數值輸出:
與1相似,只需要調整優先順序比較結果即可。(數值越小優先順序越大)
用優先順序佇列解決: 1.求一億個整數裡面,花費o(n)時間,找出前十小的資料?
1. 問題分析:
1. 先拿出前十個數入隊,假設為一億個整數中前十小的資料(a為其中的最大值)
2. 因為要找出最小的數,所以需要淘汰大的數(有較小值入隊時將最大值出隊)。
基於大根堆實現
3. 然後把剩下的數依次入隊。
在入隊前和 a 做比較
如果入隊的數 >= a,則肯定不為前十小,直接入下乙個數
若 < a ,則捨棄 a ,對新數進行入隊操作
4. 直至將最後乙個數入隊,最終剩下為前十小的數
相比較基於大根堆的優先順序佇列來說,解決此問題只需要在push()方法當放置元素下標越界時呼叫judge()函式進行上述操作 3
public void judge(t val)
// 若小於,則捨棄最大值,將新數值入隊
else
}
當一億個整數都完成入隊操作後,最終剩下的十個數為陣列中前十小的數。
2.求一億個整數裡面,花費o(n)時間,找出前十大的資料?
2. 問題分析: 1. 先拿出前十個數入隊,假設為一億個整數中前十大的資料(a為其中的最大值)
2. 因為要找出最大的數,所以需要淘汰小的數(有較大值入隊時將最小值出隊)。
基於小根堆實現
3. 然後把剩下的數依次入隊。
在入隊前和 a 做比較
如果入隊的數 <= a,則肯定不為前十小,直接入下乙個數
若 >a ,則捨棄 a ,對新數進行入隊操作
4. 直至將最後乙個數入隊,最終剩下為前十大的數
資料結構 優先順序佇列
優先佇列的底層實現 二叉堆實現優先順序佇列 練習優先順序佇列也屬於佇列,因此也提供以下介面 利用二叉堆作為優先佇列的底層實現 可以通過comparator或comparable去自定義優先順序高低 利用二叉堆實現優先順序佇列。二叉堆實現優先順序佇列 author yusael public clas...
資料結構 優先順序佇列(堆)
一 堆 0 預備知識 使用陣列儲存二叉樹結構,方式即將二叉樹用層序遍歷方式放入陣列中。這種方式的主要用法就是堆的表示。在陣列中 左孩子 left 下標 2 parent 1 右孩子 right 下標 2 parent 2 雙親 parent 下標 child 1 2 1 堆的概念 堆在邏輯上是乙個完...
優先順序佇列 資料結構和演算法
優先順序佇列 在優先順序佇列中,資料項按關鍵字的值有序,這樣關鍵字最小的資料項 或最大 總是在 隊頭。資料項插入時會按照順序插入到合適的位置以確保佇列的順序。package test13 priorityqueue created by mlink on 2017 3 17.public class...