1 #include "utility.hpp" 2 3 #include <algorithm> 4 #include <stdexcept> 5 6 namespace phosphor 7 { 8 namespace fan 9 { 10 namespace control 11 { 12 namespace utility 13 { 14 getMedian(std::vector<int64_t> & values)15int64_t getMedian(std::vector<int64_t>& values) 16 { 17 if (values.empty()) 18 { 19 throw std::out_of_range("getMedian(): Empty list of values"); 20 } 21 const auto oddIt = values.begin() + values.size() / 2; 22 std::nth_element(values.begin(), oddIt, values.end()); 23 auto median = *oddIt; 24 // Determine median for even number of values 25 if (values.size() % 2 == 0) 26 { 27 // Use average of middle 2 values for median 28 const auto evenIt = values.begin() + values.size() / 2 - 1; 29 std::nth_element(values.begin(), evenIt, values.end()); 30 median = (median + *evenIt) / 2; 31 } 32 33 return median; 34 } 35 36 } // namespace utility 37 } // namespace control 38 } // namespace fan 39 } // namespace phosphor 40