二叉堆C++实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
| class BinaryHeap { public: void push(int v); int pop(); int get_heap_size() { return binary_heap.size(); } int peak_top() { return index_at(1); }; int index_at(int i) { return binary_heap[i - 1]; } void set_at(int i, int v) { binary_heap[i - 1] = v; }; private: void adjust_heap(int idx); void adjust_heap_down(int idx); int compare(int left, int right);
std::vector<int> binary_heap = {}; static int index; };
int BinaryHeap::index = 0;
void BinaryHeap::push(int v) { binary_heap.push_back(v); index++;
if (binary_heap.size() == 1) return; adjust_heap(index); }
int BinaryHeap::pop() { if (!binary_heap.size()) return -1;
int ret = index_at(1); binary_heap[1] = index_at(index);
adjust_heap_down(1);
return ret; }
void BinaryHeap::adjust_heap(int idx) { int root; int tmp;
while ((root = idx / 2) > 0 && compare(index_at(idx), index_at(root)) < 0) { tmp = index_at(idx); set_at(idx, index_at(root)); set_at(root, tmp);
idx = root; }
}
void BinaryHeap::adjust_heap_down(int idx) { int lchild; int tmp;
while ((lchild = 2 * idx) <= index) { if (lchild + 1 <= index && compare(index_at(lchild + 1), index_at(lchild)) < 0) lchild = lchild + 1; if (compare(index_at(lchild), index_at(idx))) { tmp = index_at(idx); set_at(idx, index_at(lchild)); set_at(lchild, tmp); }
idx = lchild; } }
int BinaryHeap::compare(int l, int r) { return l - r; }
int main() { BinaryHeap binaryh; binaryh.push(12); binaryh.push(17); binaryh.push(11);
std::cout << binaryh.peak_top() << std::endl;
}
|
本文标题:二叉堆
文章作者:SkecisAI
发布时间:2022年06月27日 - 21:29:30
最后更新:2022年06月27日 - 21:31:44
原始链接:http://www.skecis.top/2022/06/27/二叉堆/
许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。
感谢你的支持,希望本文能助你一臂之力。
微信支付