演算法練習 堆排序應用 優先佇列

2021-08-17 22:55:14 字數 3168 閱讀 3703

優先佇列作為堆排序的高階應用具有十分廣泛的應用場景,其中乙個就是在共享計算機系統的作業排程。最大優先佇列記錄將要執行的各個作業以及它們之間的相對優先順序.

當乙個作業完成或者被中斷後,排程器呼叫extract-max從所有的等待作業中,選出具有最高優先順序的作業來執行。

在任何時候,排程器可以呼叫insert()把乙個新作業加入到佇列中來。

下面就討論一下關於優先佇列的基本操作:

insert(s , x):把元素x插入集合s中。

maximum(s):返回s中具有最大鍵字的元素.

extract-max(s):去掉並返回s中的具有最大鍵字的元素。

increase-key(s , x,k):將元素x的關鍵字值增加到k,這裡假設k的值不小於x的原關鍵字值。

heapdelete(a,i)    :刪除第 i 個位置的元素

下面分別給出各自的偽**描述:

把元素x插入到集合s中

1

maxheapinsert(a,key)

2 a.heapsize = a.heapsize+1

3 a[a.heapsize] =-無窮大

4 heapincreasekey(a,a[a.heapsize],key)

此時時間複雜度主要消耗在    heapincreasekey()   上,而後者的時間複雜度為   o(logn)

將元素x的關鍵字值增加為k(前提:k>=x)     整體的演算法:從開始增大的那個值開始往根節點迴圈呼叫。(自低向頂)

該方法的時間複雜度為    o(logn)     因為第三行做關鍵字更新的結點到根節點的路徑長度為  o(logn)

1

heapincreasekey(a,x,key)

2if key <=a[i]

3 error "請輸入更大的key值"

heap-increase-key的操作過程.(a)圖6-4(a)中的最大堆,其中下標為i的結點以深色陰影顯示.

(b)該結點的關鍵字增加到15.

(c)經過第 4--6 行的 while 迴圈的一次迭代,該結點與其父結點交換關鍵字,

同時下標i的指示上移到其父結點.(d)經過再一次迭代後得到的最大堆.此時,

a[parent(i)]≥a[f].現在,最大堆的性質成立,程式終止

去掉並且返回s中的最大關鍵字元素

heapmaximum(a)

max = a[0]

a[0] =a[a.heapsize]

a.heapsize = a.heapsize-1maxheap(a,0)

return max

extract_max(s)   的時間複雜度為   o( log(n) ),因此除了maxheap(a,i)的時間複雜度為o(logn)之外,其餘的時間複雜度均為常數。取得s集合中的最大值

heapmaximum(a)

return a[0]

刪除第 i 個位置的元素

1

heapdelete(a,i)

2 temp =a[i]

3 a[i] =a[a.heapsize]

4 a.heapsize = a.heapsize-1

5maxheap(a,i)

6return temp

具體的**實現:

1/*2

* 優先佇列主要通過四個函式來實現3*/

4public

class

priorityqueue ;

7public

static

int heap =a ;

8public

static

int heapsize =heap.length;910

//給優先佇列插入某乙個值 陣列大小不容易控制 可以考慮使用鍊錶

11public

void maxheapinsert(int a,int

key)

1617

//增加第i個元素的數值

18public

void heapincreasekey(int a2, int i, int

key)

2728}29

30//

交換陣列中的兩個元素

31private

void swap(int a2, int parent, int

i) 36

37//

取得優先佇列的最大值

38public

intheapmaximum()

4142

//去掉並且返回最大值最大值

43public

int heapextractmax(int

b)50

51//

52public

void maxheapdelete(int b,int

i)58

59public

void printmy(int

a)64

6566

public

static

void

main(string args)

8788 }

總之,對於優先佇列中所有的操作都可以在   o(logn)  的時間複雜度內完成。

優先佇列 堆排序

一種支援刪除最大元素和插入元素兩種操作的資料結構叫做優先佇列。實現棧or佇列與實現優先佇列的最大不同在於效能的要求。對於棧和佇列,我們實現能在常數時間完成所有操作 而優先佇列,插入元素和刪除最大元素這兩個操作在最壞情況下需要線性時間完成 優先佇列的各種實現在在最壞情況下執行時間的增長數量級 資料結構...

堆排序 優先佇列

1.堆排序 a.堆的定義 n個元素序列當且僅當滿足以下關係時,稱之為堆。ki k2i且ki k2i 1 小根堆 ki k2i且ki k2i 1 大根堆 以下針對最大堆 b.維護堆的性質 max heapify通過讓a i 的值在最大堆中 逐級下降 a i 的值小於其左右孩子的值時 從而使得以i為根結...

演算法導論 堆排序 優先佇列

二叉堆是乙個陣列,可以被看做乙個近似的完全二叉樹。性質 建堆 可以使用自底向上的方法利用過程maxheapify 向下調整堆 把陣列a 1 n 轉換為堆。偽 向下調整堆maxheapify 偽 演算法描述 3.向上調整堆 向上調整堆 private void adjustup int a,int i...