許多應用程式都系要處理有序的元素,但不應定要求它們完全有序,或者不一定要一次就將它們排序。很多時候我們**集一些元素,然後處處理當前鍵值最大的元素,然後再收集更多的元素,再狐狸當前鍵值最大的元素……舉個生活中的例子吧,就像我們用的手機一樣,手機裡面有很多程序,但是有乙個程序的優先順序特別高,那就是來電顯示(不然的話,放你在打遊戲的時候也不會因為來電而退出,嘿嘿)。優先佇列是區域性有序的,它並不將所有的元素都排成成有序的。
key delmax()用來刪除佇列中最大的元素
void insert(key value)用來插入新元素
boolean isempty() 用來判斷佇列是否為空
int getsize() 返回 佇列中的元素個數
key getmax() 返回佇列中的最大值元素
我們用二叉堆表示法來實現優先佇列,首先來介紹一下什麼是二叉堆
在乙個二叉樹裡面,如果每個結點都大於等於它的兩個子結點的時候,那麼那它就是堆有序的;二叉堆是一組能夠用堆有序的完全二叉樹(若設二叉樹的深度為h,除第 h 層外,其它各層 (1~h-1) 的結點數都達到最大個數,第 h 層所有的結點都連續集中在最左邊,這就是完全二叉樹。)排序的元素,並在陣列中按照層級儲存(為了表示方便,我們不使用陣列中的第乙個元素)。所以根節點的地方是佇列中鍵值最大的元素。
堆實現的比較和交換演算法
private boolean less(int i,int j)
private void exch(int i,int j)
由下至上的堆有序化—swim(上浮)
private
void
swim(int k)
}
由上至下的堆有序化—sink(下沉)
private
void
sink(int k)
if(!less(k,j))
exch(k,j);
k=j;}}
插入函式和刪除最大元素最大函式
public void insert(int elem)
public int delmax()
基於堆的優先隊全部**
package 優先佇列1;
public
class priorityqueue
public
priorityqueue(int length)
private
void
swim(int k)
}private
void
sink(int k)
if(!less(k,j))
exch(k,j);
k=j;}}
public
intgetelemsize()
public boolean isempty()
public
void
insert(int elem)
public
intdelmax()
private
void
display()
public
static
void
main(string args)
}
執行結果如下:
改進版的堆排序請參考
演算法–優先佇列之堆排序((二)公升級版)
優先佇列 堆排序
一種支援刪除最大元素和插入元素兩種操作的資料結構叫做優先佇列。實現棧or佇列與實現優先佇列的最大不同在於效能的要求。對於棧和佇列,我們實現能在常數時間完成所有操作 而優先佇列,插入元素和刪除最大元素這兩個操作在最壞情況下需要線性時間完成 優先佇列的各種實現在在最壞情況下執行時間的增長數量級 資料結構...
堆排序 優先佇列
1.堆排序 a.堆的定義 n個元素序列當且僅當滿足以下關係時,稱之為堆。ki k2i且ki k2i 1 小根堆 ki k2i且ki k2i 1 大根堆 以下針對最大堆 b.維護堆的性質 max heapify通過讓a i 的值在最大堆中 逐級下降 a i 的值小於其左右孩子的值時 從而使得以i為根結...
堆排序 最大優先佇列
優先佇列支援的操作 insert maximum,extract,increasekey,include include include define number 100 define num 6 using namespace std struct heaptype void exchange ...