【发布时间】:2019-11-27 18:10:34
【问题描述】:
好的,所以我创建了一个程序,它接收一个向量并计算中位数。虽然我得到了奇数的正确中值,但我得到了偶数的正确中值。这是我的代码:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
bool check;
cout<<"Hello World";
vector<double> vec;
vec.push_back(2);
vec.push_back(6);
vec.push_back(8);
vec.push_back(62);
double median;
if(check==vec.size()%2)
{
median=(vec[vec.size() / 2 - 1] + vec[vec.size() / 2]) / 2;
}
else{
median=vec[(vec.size() / 2.0)];
}
cout<<median;
return 0;
}
所以当我在线查看时,正确答案应该是 7,但我得到 8.. 这仅发生在偶数计算中.. 我做错了什么,我不明白
【问题讨论】:
-
check的作用是什么? -
特别是考虑到
check是未初始化的,因此有一个indeterminate值,当你使用它时会导致undefined behavior。 -
为什么不只是
std::nth_element(vec.begin(), vec.begin() + vec.size()/2, vec.end()); std::cout << "The median is " << vec[vec.size()/2] << '\n';? -
@JesperJuhl 他已经有一个排序的数据。现在他在处理奇数或偶数数据时遇到了问题。
-
@MarekR 它在 this 的情况下排序,是的。但我想提出一个不依赖预排序数据的通用解决方案。至于偶数与奇数大小,我认为您不需要处理超出我建议的范围。对于偶数个元素,您必须选择中点之前或之后的元素,但您选择哪个并不重要,我的解决方案始终选择较低的。这应该没问题。唯一要处理的极端情况是空向量。