求无序数组中的中值

template <typename T>
double Median(const std::vector<T>& elems) {
  THROW_CHECK(!elems.empty());

  const size_t mid_idx = elems.size() / 2;

  std::vector<T> ordered_elems = elems;
  
  /* std::nth_element 是 C++ 标准库算法中的一个非常有用的函数,它定义在 <algorithm> 头文件中。
  该函数主要用于对序列中的元素进行部分排序,以便序列中第 n 个位置的元素处于其最终排序位置,同时保证所有小于它的元素都位于其前面,
  所有大于它的元素都位于其后面。但是,它并不保证其他元素的相对顺序。*/

  std::nth_element(ordered_elems.begin(),
                   ordered_elems.begin() + mid_idx,
                   ordered_elems.end());

  if (elems.size() % 2 == 0) {
    const T mid_element1 = ordered_elems[mid_idx];
    const T mid_element2 = *std::max_element(ordered_elems.begin(),
                                             ordered_elems.begin() + mid_idx);
    return 0.5 * mid_element1 + 0.5 * mid_element2;
  } else {
    return ordered_elems[mid_idx];
  }
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值