c语言中位数怎么求,C计算中位数参考

我试着计算一个叫做中位数的矢量的中位数:

std::nth_element(median.begin(), median.begin() + median.size() / 2, median.end());

medianVal = median[median.size() / 2];

cout << "The median is " << medianVal << endl;

这很好用.但我需要在其原始向量中获得中值的位置.我怎么能这么快做到这一点?

解决方法:

我假设你不想重新订购原始容器.如果错了,有更简单的方法.

nth_element采用比较器.

所以首先在原始容器中创建一个迭代器向量,然后编写一个带有2个迭代器的比较器,对它们进行deference,amd比较结果.

template

auto median(C const& c){

using std::begin; using std::end;

auto start = begin(c);

auto finish = end(c);

using iterator = decltype(start);

std::vector working;

for(auto it = start; it != finish; ++it)

working.push_back(it);

if (working.empty())

return start;

std::nth_element(

begin(working), begin(working) + working.size() / 2, end(working),

[](iterator lhs, iterator rhs){

return *lhs < *rhs;

}

);

return *(begin(working) + working.size() / 2);

}

这确实依赖于一些C 14(自动返回类型推导),但是每个主要的编译器(可能除了icc?)现在都支持它.

它足够灵活,甚至可以处理C风格的数组,我认为它甚至适用于哨兵.

标签:median,c

来源: https://codeday.me/bug/20190727/1556041.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值