能否写一段用set维护中位数的C++程序
时间: 2023-05-25 21:03:56 浏览: 171
下面是用set维护中位数的C程序:
```c
#include <stdio.h>
#include <stdlib.h>
#include <set>
using namespace std;
int main() {
multiset<int> nums; // 定义multiset容器
int n, x;
scanf("%d", &n);
for(int i = 1; i <= n; i++) {
scanf("%d", &x);
nums.insert(x); // 插入元素
if(i % 2 == 1) { // 奇数个元素时,取中间值
multiset<int>::iterator it = nums.begin(); // 获取迭代器
advance(it, i / 2); // 移动迭代器i/2个位置
printf("%d\n", *it); // 输出中位数
}
else { // 偶数个元素时,取中间两个数的平均值
multiset<int>::iterator it1 = nums.begin(); // 获取迭代器
advance(it1, i / 2 - 1); // 移动迭代器
multiset<int>::iterator it2 = it1;
it2++; // 移动迭代器
printf("%d\n", (*it1 + *it2) / 2); // 输出中位数
}
}
return 0;
}
```
程序的流程是这样的:
1. 定义一个multiset容器,用于存储输入的数。
2. 读入输入的数,将数插入multiset中。
3. 根据当前元素个数,计算中位数并输出。
对于奇数个元素的情况,直接找到中间位置的数即可。由于multiset中元素已经按从小到大的顺序排序,因此可以直接使用begin()函数获取第一个元素的迭代器,然后使用advance()函数移动迭代器i/2个位置即可得到中位数。
对于偶数个元素的情况,需要找到中间两个数的平均值。同样地,可以先找到第i/2-1个数和第i/2个数的迭代器,然后将它们的值相加,再除以2即可得到中位数。
最后,输出中位数即可。
阅读全文