優先級隊列 是不同於先進先出隊列的另一種隊列。每次從隊列中取出的是具有最高優先權的元素。
優先隊列是0個或多個元素的集合,每個元素都有一個優先權或值,對優先隊列執行的操作有:
Create ( ):創建一個空的優先隊列
DeleteMax (x):從隊列中刪除具有最大優先權的元素,並將該元素返回至x。
優先級隊列的幾種實現方式:
1)數組:
有序的時候: insert() 爲 O(n) ,因爲要向後移動, Max() 爲O(1),
無序的時候: insert() 爲O(1),Max() 爲 O(n) ,因爲要比較n次。
綜合n的數的隊列時,插入需要O(n^2)
2) 鏈表:大概分析同數組一樣。
3)堆——此方法爲最好的情況。
insert() 爲O(log n),Max() 爲 O(1) ,但是DeleteMax() 爲O(log n), 即調整堆的時間,所以對於元素個數爲n的隊列,insert() 爲O(n *log n ).
堆插入元素t,另x[n]=t,n=n+1,shiftup(n)
堆刪除堆頂元素, 先記錄x[0],然後另 x[1]=x[n], n=n-1, siftdown(n).
堆使用的數組x[0...n]需要n+1個字的額外內存。
由此得到堆排序的算法:
for( i=2; i<=n; i++)
siftup( i);// siftup(n),從i =n 開始進行調整,i=i/2
for(i=n; i>=2; i--)
{
printf( x[1]);
swap(1,i);
siftdown(i-1);//從i=1 開始調整, i=2i 或者 i=2i+1. 括號裏面的參數表述堆元素的個數,並不代表開始調整的堆元素的位置。
}
// 自己很容易搞混的地方,shiftup 總是從最後一個元素開始的,shitfdown 總是從第一個元素開始的,括號裏始終表示堆裏剩餘元素的個數。
優先隊列插入和刪除元素的複雜度都是O(lgn),所以很快。
另一種描述方法是採用有序線性表,當元素按遞增次序排列,使用鏈表時則按遞減次序排列,這兩種描述方法的刪除時間均爲( 1 ),插入操作所需時間爲(n).