用c++实现以下堆的基本操作的实现 输入格式: 第一行有一个整数m (m<=10000) ,以下m行每行描述一个命令 。 命令格式1: 表示Insert(int val)。 (将x插入堆,val范围(0-10000)) 命令格式2: 表示Delete_Min。 (删除堆顶元素) 命令格式3 :表示Delete(int i). (删除堆中第i个元素) 命令格式4 : 表示Decrease_Value(int i, int val)(减少堆中第i个元素的 值,令其为x,并向上调整从而满足堆要求,val范围(0-10000)) 输出格式:输出最后一步操作后的堆排序结果
时间: 2024-02-27 20:56:31 浏览: 52
以下是堆的基本操作的实现,包括Insert、Delete_Min、Delete、Decrease_Value:
```c++
#include <iostream>
#include <algorithm>
using namespace std;
const int MAXN = 10005;
int n, tot, heap[MAXN];
void up(int x) {
while (x > 1 && heap[x] < heap[x / 2]) {
swap(heap[x], heap[x / 2]);
x /= 2;
}
}
void down(int x) {
int son;
while (x * 2 <= tot) {
son = x * 2;
if (son + 1 <= tot && heap[son + 1] < heap[son]) {
son++;
}
if (heap[x] <= heap[son]) {
break;
}
swap(heap[x], heap[son]);
x = son;
}
}
void insert(int val) {
heap[++tot] = val;
up(tot);
}
void delete_min() {
heap[1] = heap[tot--];
down(1);
}
void del(int x) {
heap[x] = heap[tot--];
up(x);
down(x);
}
void decrease_value(int x, int val) {
heap[x] = val;
up(x);
}
int main() {
cin >> n;
for (int i = 0; i < n; i++) {
int op;
cin >> op;
if (op == 1) {
int val;
cin >> val;
insert(val);
} else if (op == 2) {
delete_min();
} else if (op == 3) {
int x;
cin >> x;
del(x);
} else if (op == 4) {
int x, val;
cin >> x >> val;
decrease_value(x, val);
}
}
sort(heap + 1, heap + tot + 1);
for (int i = 1; i <= tot; i++) {
cout << heap[i] << " ";
}
return 0;
}
```
对于每个操作,我们都可以通过维护堆的性质,即父节点小于等于子节点,来进行调整。Insert操作是将一个元素插入堆中,可以将其放在堆的最后,然后向上调整,直到满足堆的性质为止。Delete_Min操作是删除堆顶元素,可以将堆顶元素和堆的最后一个元素交换,然后删除最后一个元素,并向下调整堆顶元素,直到满足堆的性质为止。Delete操作是删除堆中第i个元素,可以将其替换为堆的最后一个元素,然后向上调整和向下调整,直到满足堆的性质为止。Decrease_Value操作是减少堆中第i个元素的值,可以将其替换为新的值,然后向上调整,直到满足堆的性质为止。
最后,我们将堆中的元素排序,输出结果即可。
阅读全文