小学期学的算法和做OJ题的各种经验总结
小顶堆。可以用vector实现。
求最大的前k个数就可以构造一个k个元素的小顶堆,堆顶是k个大数中最小的,新元素比堆顶大就替换堆顶、排序,否则不管
对一组数据入堆后按顺序取出可以达到堆排序的效果
特征:
父亲的值 < 儿子的值,元素从上到下从左到右紧凑排列(完全二叉树)
过程:
- heapify:对当前节点不断向下交换直到没有大小颠倒,交换的时候优先选数值小的儿子换
- 入堆:插在堆的末尾(数组的最后一个),然后不断向上提升直到没有大小颠倒
- 出堆:出根节点,然后把最后一个节点赋值给根节点。对根节点heapify
※
编号从0开始,左儿子编号:i*2+1
,右儿子编号:i*2+2
,父亲编号:(i-1)/2
(向下取整)
#include <iostream>
#include <vector>
using namespace std;
struct SmallHeap {
SmallHeap() {
n = 0; }
public:
bool empty() {
return heap.size() == 0; }
int size() {
r