Linux C C 利用小根堆實現topN

2021-10-20 16:26:44 字數 2474 閱讀 8977

#include

#include

std::vector<

int>

topn

(const std::vector<

int>

& arry,

const

unsigned

int toplen)

;void

createheap

(std::vector<

int>

& res)

;void

heapify

(std::vector<

int>

& res,

const

int start,

const

int end)

;void

pushheap

(std::vector<

int>

& res,

const

int val)

;void

sortbyheap

(std::vector<

int>

& arry)

;int

main

(int argc,

char

*ar**)

; std::vector<

int> arry =

;// sort

sortbyheap

(arry)

; std::cout <<

"sort:"

<<

'\n'

;for

(int i =

0; i < arry.

size()

; i++

) std::cout <<

'\n'

;// topn

std::vector<

int> res =

topn

(arry,8)

; std::cout <<

"topn:"

<<

'\n'

;for

(int i =

0; i < res.

size()

; i++

) std::cout <<

'\n'

;return0;

}std::vector<

int>

topn

(const std::vector<

int>

& arry,

const

unsigned

int toplen)

std::vector<

int> res;

// 建立小根堆

for(

unsigned

int i =

0; i < toplen;

++i)

createheap

(res)

;//for (unsigned int i = 0; i < res.size(); ++i)

////std::cout << '\n';

// 計算結果

for(

unsigned

int i = toplen; i < arry.

size()

;++i)

}return res;

}void

createheap

(std::vector<

int>

& res)

}void

heapify

(std::vector<

int>

& res,

const

int start,

const

int end)

if(res[dad]

< res[son]

) tmp = res[dad]

; res[dad]

= res[son]

; res[son]

= tmp;

dad = son;

son =

2* dad +1;

}}void

pushheap

(std::vector<

int>

& res,

const

int val)

void

sortbyheap

(std::vector<

int>

& arry)

}

這是利用小根堆來實現的topn演算法,首先取前n個數組成小根堆,再將後面的元素遍歷,若大於堆頂,則表明還有更大的元素,需要將該元素放入堆中,重新組成小根堆,push的方法採用的下沉的方法。即將堆頂部元素下沉至合適的位置。最後返回堆即可。

為方便驗證,同時加入了堆排序由大到小便於觀察。

小根堆 陣列實現

特點 父節點永遠比孩子節點小,不強制要求左孩子比右孩子小,但是為了實現方便,我令其左孩子比右孩子小。反之為大根堆。push 插入元素 陣列長度增加 注意 增加的不是本次插入所需要的位置,而是下次元素的位置,這句話能解釋為什麼pop的時候需要 se才能拿到當前堆中的最後乙個元素 從下往上判斷是否滿足小...

堆(大根堆 小根堆)

堆又可稱之為完全二叉堆。這是乙個邏輯上基於完全二叉樹 物理上一般基於線性資料結構 如陣列 向量 鍊錶等 的一種資料結構。學習過完全二叉樹的同學們都應該了解,完全二叉樹在物理上可以用線性資料結構進行表示 或者儲存 例如陣列int a 5 就可以用來描述乙個擁有5個結點的完全二叉樹。那麼基於完全二叉樹的...

堆(Heap)大根堆 小根堆

具有以下的特點 1 完全二叉樹 2 heap中儲存的值是偏序 min heap 父節點的值小於或等於子節點的值 max heap 父節點的值大於或等於子節點的值 一般都用陣列來表示堆,i結點的父結點下標就為 i 1 2。它的左右子結點下標分別為2 i 1和2 i 2。如第0個結點左右子結點下標分別為...