動畫 二叉堆解讀 堆排序,優先佇列

2021-09-28 22:17:19 字數 4015 閱讀 1872

二叉堆

是乙個陣列,近似完全二叉樹,分為

最大堆,除根外,任意父親節點值≥兒子節點值(性質),一般用於堆排序

最小堆,除根外,任意父親節點值≤兒子節點值(性質),一般用於優先佇列

完全二叉樹只要乙個陣列就可以實現,而不需要鏈,也就是說如果樹有n個結點,存在陣列中的下標位為1~n,很容易模擬結點的上下移動:由於位置為j的父節點位置為⌊ j/2 ⌋,兩個子節點的位置分別為2j,2j+1,比如14的父親⌊ 2/2 ⌋=1,兩個子節點4 與 5

完全二叉樹:除最底層外,該樹完全充滿,而且每層從左至右填充

維護的是除根外任意父親節點比兒子節點大的性質,堆排序和優先佇列都是基於這些維護的操作來實現注

下面**都是 [1~n],0號下標沒有用

1. 上濾:增大值或者插入操作需要用到

與它的父親比較大小直到比他父親小或者到頂了,類似於下

//防止寫入0

else heap[i]

= key;

}2. 下濾:減小值或者刪除操作需要用到

與它的兒子比較大小直到比他兒子大或者到底了,類似於下

}3. 如何建立堆

從最下非葉子結點層開始進行下濾down操作直到根結點

void

createheap

(int

*array,

int heapsize)

堆排序是乙個優秀的演算法,任何時候只需要常數個額外的元素空間儲存臨時資料,具有空間原址性,複雜度僅為o(nlgn)

首先要在先是堆的前提下進行排序,所以第一步要呼叫createheap,建立了[1~n]的堆

createheap

(array,10)

;

然後不斷讓第乙個結點與最後乙個個結點互換,然後將這個結點從堆中去除(可以直接用heapsize–即完成),重複這一步直到堆中沒有結點,下面只演示了排好三個,後面同理

}優先佇列是一種用來維護由一組元素構成的集合s的資料結構,其中每乙個元素都有乙個相關的值,也就是關鍵字,優先佇列分為最大優先佇列和最小優先佇列

最大優先佇列

應用有很多,比如共享計算機系統的作業呼叫。最大優先佇列記錄要執行的各個作業以及他們之間的相對優先順序。當乙個作業完成或被中斷後,排程器將呼叫下面的dequeue,選出優先順序最高的作業執行,並去除;呼叫下面的enqueue,插入新作業到佇列中

最小優先佇列

可以被用於基於事件驅動的模擬器等等,在此不一 一說了

int

returnmax

(int

*heap)

出隊的是第乙個元素操作步驟是被最後乙個節點覆蓋,然後將該結點從堆中去除(可以直接用heapsize–即完成),最後使用down下濾操作維護,如下出隊16

將將要插入的數字掛在陣列末端且heapsize++ 入隊後,使用up上濾來維護

檢查某個結點的值改動是增大還是變小,分別呼叫up和down操作

//第乙個元素不算

//大根堆

int heapsize =10;

// enlarge heap[index], go up

// insert a value to heap[last+1],try to go up

voidup(

int index,

int*heap,

int heapsize)

//防止寫入0

else heap[i]

= key;

}//enlarge heap[index], go down

//delete a value

void

down

(int index,

int*heap,

int heapsize)

heap[i /2]

= key;

}void

createheap

(int

*array,

int heapsize)

void

enqueue

(int

*heap,

int num)

void

dequeue

(int

*heap)

void

heapsort

(int

*heap)

}void

modifyvalue

(int

*heap,

int index,

int num)

if(num > heap[index])}

intmain()

d堆與二叉堆類似,只是d堆中每個節點擁有d個後裔,不僅僅是兩個。縮減了樹的高度,也就縮減了插入的時間,但是刪除的操作變慢了了

二叉堆很容易推廣至d堆,此時位置為j的節點,父節點位置⌈(j-1)/d⌉,子節點位置為}

排序演算法 四 優先佇列 二叉堆以及堆排序

我們經常會碰到下面這種情況,並不需要將所有資料排序,只需要取出資料中最大 或最小 的幾個元素,如排行榜。那麼這種情況下就可以使用優先佇列,優先佇列是乙個抽象資料型別,最重要的操作就是刪除最大元素和插入元素,插入元素的時候就順便將該元素排序 其實是堆有序,後面介紹 了。二叉堆其實是優先佇列的一種實現,...

優先佇列 二叉堆,堆排序

2.4 優先佇列 二叉堆 簡介 可以刪除最大元素和插入元素 特點 高效 對數級別的 刪除最大元素和插入元素操作 public class priorityheap public priorityheap int initsize 獲取最小的元素 public int min 刪除最小的元素 publ...

優先佇列 二叉堆

優先佇列 二叉堆 二叉堆是一棵完全二叉樹,最大堆 最小堆 中,所有根節點的鍵值都要比對應的子樹要大 小 由於是完全二叉樹,所以儲存結構可以採用陣列。最大堆的建立 include include include include include include define inf 0x3f3f3f3f...