中位数由下式给出
const auto median_it = len.begin() + len.size() / 2;
std::nth_element(len.begin(), median_it , len.end());
auto median = *median_it;
对于偶数(向量的大小),您需要更精确一些。例如,您可以使用
assert(!len.empty());
if (len.size() % 2 == 0) {
const auto median_it1 = len.begin() + len.size() / 2 - 1;
const auto median_it2 = len.begin() + len.size() / 2;
std::nth_element(len.begin(), median_it1 , len.end());
const auto e1 = *median_it1;
std::nth_element(len.begin(), median_it2 , len.end());
const auto e2 = *median_it2;
return (e1 + e2) / 2;
} else {
const auto median_it = len.begin() + len.size() / 2;
std::nth_element(len.begin(), median_it , len.end());
return *median_it;
}
当然我们有很多不同的方式来获取元素e1
。我们还可以使用max
或者任何我们想要的。但这条线很重要,因为nth_element
只放置n
如果正确地选择了第一个元素,则其余元素将排序在该元素之前或之后,具体取决于它们是更大还是更小。这个范围是unsorted.
这段代码保证有平均线性复杂度, i.e., O(N)
,因此它渐近地优于排序,即O(N log N)
.
关于您的代码:
for (i=0; i<len.size(); i++){
if (len[i]>len[i+1])
当您访问时,这将不起作用len[len.size()]
在最后一次迭代中不存在。