0%

二叉堆

二叉堆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 国际 转载请保留原文链接及作者。

感谢你的支持,希望本文能助你一臂之力。