#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個結點左右子結點下標分別為...